我已阅读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;
}
在构建存储库时,上面的实现会失效。
有人可以解决一些问题吗?谢谢!
答案 0 :(得分:2)
我看到两种可能的方法。
依靠协方差和逆变。您可以通过为EntityWithStatus创建接口接口并使IEntityWithStatus和IRepository协变(添加到泛型类型定义)来使转换成功。
依靠动态和杠杆通用类型推断。基本上,存储库是动态的。
我建议使用数字1.