如何构建通用的IEventHandler?

时间:2017-08-21 19:30:51

标签: aspnetboilerplate

我已阅读https://aspnetboilerplate.com/Pages/Documents/EventBus-Domain-Events以及ABP实体事件处理程序的实现https://github.com/aspnetboilerplate/aspnetboilerplate/tree/f10fa5205c780bcc27adfe38aaae631f412eb7df/src/Abp/Events/Bus/Entities

我花了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;
}

在构建存储库时,上面的实现会失效。

有人可以解决一些问题吗?谢谢!

1 个答案:

答案 0 :(得分:2)

我看到两种可能的方法。

  1. 依靠协方差和逆变。您可以通过为EntityWithStatus创建接口接口并使IEntityWithStatus和IRepository协变(添加到泛型类型定义)来使转换成功。

  2. 依靠动态和杠杆通用类型推断。基本上,存储库是动态的。

  3. 我建议使用数字1.