zoukankan      html  css  js  c++  java
  • NopCommerce商城系统中的eventbus

    nopcommerce中事件发布与订阅是相对比较规范的,

    1、IConsumer 消费者

    public interface IConsumer<T>
    {
    void HandleEvent(T eventMessage);
    }

    2、IEventPublisher 事件发布者

    事件调用者,程序入口,

    /// <summary>
    /// Evnt publisher
    /// </summary>
    public interface IEventPublisher
    {
    /// <summary>
    /// Publish event
    /// </summary>
    /// <typeparam name="T">Type</typeparam>
    /// <param name="eventMessage">Event message</param>
    void Publish<T>(T eventMessage);
    }

    3、ISubscriptionService 事件订阅服务

    /// <summary>
    /// Event subscription service
    /// </summary>
    public interface ISubscriptionService
    {
    /// <summary>
    /// Get subscriptions
    /// </summary>
    /// <typeparam name="T">Type</typeparam>
    /// <returns>Event consumers</returns>
    IList<IConsumer<T>> GetSubscriptions<T>();
    }

    获取事件所有消费者

    案例:

    有这样一个需求,用户登录模块,用户登录之后我需要将登陆日志保存到数据库,同时我需要将用户所具有权限放到缓存

    //传统做法

    public class UserService :IUserService

    {

        public Log(User model)

        {

           //验证用户,验证成功

           //调用日志服务,将登陆信息记录到数据库

          //调用缓存服务,将用户权限放到缓存里

        }

    }

    注意绿色部门都是用户登录之后操作的事情,我们会不会考虑将这两个操作当作一个事件,也就是表示这两个相当于用户登录关联的消费者,使用事件发布的方式来处理。

    演变之后:

    定义用户登录事件:

    //用户消费者
    public class CustomerEventConsumer : IConsumer<CustomerLoggedinEvent>,IConsumer<CustomerRegisteredEvent>
    {
    /// <summary>
    /// 处理用户登录事件
    /// </summary>
    /// <param name="eventMessage"></param>
    public void HandleEvent(CustomerLoggedinEvent eventMessage)
    {
    //记录日志
    Console.Write("登陆成功");

    //记录登陆日志
    }

    public void HandleEvent(CustomerRegisteredEvent eventMessage)
    {
    //记录日志
    Console.Write("注册成功");

    //更新数据
    }
    }

    修改之后如下:

    public class UserService :IUserService

    {

        public Log(User model)

        {

           //验证用户,验证成功 

        

       调用事件发布

           _eventPublisher.Publish(new CustomerLoggedinEvent(customer));

        }

    }

    简单写了一下

     

  • 相关阅读:
    VS2010 修改模板文件,增加默认注释
    Substring方法(C#,JS,Java,SQL)的区别
    好的架构是进化来的,不是设计来的
    SQL Server编程系列(2):SMO常用对象的有关操作
    (转) SQL Server编程系列(1):SMO介绍
    SQL Server的分页优化及Row_Number()分页存在的问题
    CTE(Common Table Expression) 公用表表达式
    SSH加密原理、RSA非对称加密算法学习与理解
    asp.net 项目目录说明
    【转】SOA架构设计经验分享—架构、职责、数据一致性
  • 原文地址:https://www.cnblogs.com/alexhack/p/5285224.html
Copyright © 2011-2022 走看看