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));

        }

    }

    简单写了一下

     

  • 相关阅读:
    vue axios的使用
    html5 css写出一个实心三角形和空心三角行
    弹出新页面并使整个旧页面背景变暗功能的实现代码
    radio 单选按钮 选中多个
    搭建脚手架cli2.x环境
    页面滚动条位置触发事件
    DataGridView行号发生变化 使用的事件
    eclipse git 忽略文件
    eclipse git 分享项目到GitHub上
    eclipse git 创建新分支 合并分支 删除分支
  • 原文地址:https://www.cnblogs.com/alexhack/p/5285224.html
Copyright © 2011-2022 走看看