您的位置:首页 > 运维架构

NopCommerce商城系统中的eventbus

2016-03-16 21:21 295 查看
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)

{

//验证用户,验证成功

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

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

}

}

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

演变之后:

定义用户登录事件:

//用户消费者
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));

}

}

简单写了一下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: