如何解决无法在.NET Core中注册嵌套的通用接口
我正在尝试在DI容器中注册嵌套的泛型类型,但无法注册
throws {开放通用服务类型需要注册一个开放通用实现类型。 (参数描述符)}错误
实现接口方法如下:
public class CustomerEvent<TEntity> : IEventConsumer<EntityInsertedEvent<TEntity>>,IEventConsumer<EntityUpdatedEvent<TEntity>>,IEventConsumer<EntityDeletedEvent<TEntity>> where TEntity : BaseEntity
{
public void HandleEvent(EntityInsertedEvent<TEntity> eventMessage)
{
throw new NotImplementedException("Inserted");
}
public void HandleEvent(EntityUpdatedEvent<TEntity> eventMessage)
{
throw new NotImplementedException("Updated");
}
public void HandleEvent(EntityDeletedEvent<TEntity> eventMessage)
{
throw new NotImplementedException("Deleted");
}
}
尝试
Assembly.GetExecutingAssembly()
.GetTypes()
.Where(item => item.GetInterfaces()
.Where(i => i.IsGenericType)
.Any(i => i.GetGenericTypeDefinition() == typeof(IEventConsumer<>))
&& !item.IsAbstract && !item.IsInterface)
.ToList().ForEach(assignedTypes =>
{
assignedTypes.GetInterfaces()
.Where(i => i.GetGenericTypeDefinition() == typeof(IEventConsumer<>)).ToList()
.ForEach(imp =>
{
services.AddScoped(imp,assignedTypes);
});
});
但失败了
解决方法
没有简单的方法可以做到这一点。通常,您需要将开放式抽象映射到开放式实现,如下所示:
services.AddTransient(typeof(IEventConsumer<>),typeof(CustomerEvent<>));
但是,这在您的情况下不起作用,因为MS.DI无法确定IEventCustomer<T>
的通用类型参数应如何映射到CustomerEvent<TEntity>
的通用类型参数。例如,在解析IEventCustomer<EntityInsertedEvent<Order>>
时,它将尝试创建一个CustomerEvent<EntityInsertedEvent<Order>>
,而它本来应该创建一个CustomerEvent<Order>
。
这不是.NET或CLR的限制,而是特定于MS.DI DI容器的限制,因为某些其他DI容器实际上能够进行此类映射。
不幸的是,对于MS.DI,没有简单的出路。您唯一可以做的就是显式地进行所有可能的封闭通用注册,例如:
s.AddTransient<IEventConsumer<EntityInsertedEvent<Order>>,CustomerEvent<Order>>();
s.AddTransient<IEventConsumer<EntityInsertedEvent<Customer>>,CustomerEvent<Customer>>();
s.AddTransient<IEventConsumer<EntityInsertedEvent<Product>>,CustomerEvent<Product>>();
s.AddTransient<IEventConsumer<EntityInsertedEvent<Employee>>,CustomerEvent<Employee>>();
s.AddTransient<IEventConsumer<EntityInsertedEvent<etc>>,CustomerEvent<etc>>();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。