2017-08-21 32 views
0

我讀過https://aspnetboilerplate.com/Pages/Documents/EventBus-Domain-Events也ABP的實現實體的事件處理程序https://github.com/aspnetboilerplate/aspnetboilerplate/tree/f10fa5205c780bcc27adfe38aaae631f412eb7df/src/Abp/Events/Bus/Entities如何構建泛型IEventHandler?

我已經花了8小時的工作試圖找到一個解決我的問題,但我沒能成功。

我有一個指向名爲DatumStatus一個單一的實體,它記錄產生不同狀態的某些動作,比如某些實體:批准,修改,審覈,歸檔等

我想生成一個通用EventHandler能夠根據這些操作修改其狀態。

基於一種算法的一個例子:

EventBus.Trigger(new ApproveEventData{ 
    Repository = _certainRepository, 
    Ids = [1, 4, 5] 
}); 

處理程序本身會反過來,處理這種狀態轉換

public void HandleEvent(ApproveEventData eventData) 
{ 
    eventData.Repository.Where(p => p.Id.IsIn(eventData.Ids)).ForEach(p => { 
     p.Approved = true; 
     p.ApprovalDate = DateTime.Now() 
    }); 
} 

的問題是,我需要編寫一個通用ApproveEventData和處理程序能夠爲每個實體觸發相同的HandleEvent。

「最近的」 我得到的是:

EventBus.Trigger(typeof(ApproveEventData<int>), (IEventData) new ApproveEventData<int> { 
    Repository = (IRepository<EntityWithStatus<int>, int>) _entityRepository, 
    Ids = selectedIds 
}); 

[Serializable] 
public class ApproveEventData<TPrimaryKey> : EventData 
{ 
    public IRepository<EntityWithStatus<TPrimaryKey>, TPrimaryKey> Repository; 
    public TPrimaryKey[] Ids; 
} 

以上failes實現鑄造庫時。

難道有人會發光嗎?謝謝!

回答

2

我看到兩種可能的方法。

  1. 依賴於協方差和逆變。您可以通過爲EntityWithStatus創建一個接口並使IEntityWithStatus和IRepository協變(添加到泛型類型定義)來使演員成功。

  2. 依靠動態並利用泛型類型推斷。基本上Repository是動態的。

我推薦號碼1

+0

霍莉****。 #1工作。 我愛你 –

+0

很高興工作。如果這是全部的請請接受市場 – Jeff

+0

我只能在4分鐘內接受。別擔心,我會做的。 –