NopCommerce商城系統中的eventbus

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

    }

}

 

簡單寫了一下

相關文章
相關標籤/搜索