nopcommerce中事件发布与订阅是相对比较规范的,数据库
一、IConsumer 消费者缓存
public interface IConsumer<T>
{
void HandleEvent(T eventMessage);
}spa
二、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);
}ip
三、ISubscriptionService 事件订阅服务it
/// <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>();
}io
获取事件全部消费者event
案例:class
有这样一个需求,用户登陆模块,用户登陆以后我须要将登录日志保存到数据库,同时我须要将用户所具备权限放到缓存
//传统作法
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));
}
}
简单写了一下