以下是我的界面设计:
public interface IDomainRepository<in TRequest,out TResponse>
{
Task<IEnumerable<TResponse>> QueryAsync(TRequest inputParameters);
}
由于我有很多实体,因此热衷于按如下方式使用开放式通用绑定,因此它会处理所有绑定:
kernel.Bind(typeof(IDomainRepository<,>))
.To(typeof(CommonDomainRepository<,>)).Named("Common");
面临的挑战是使用基于Func delegate
的注入,以便可以在运行时传递名称绑定,例如:
kernel.Bind<Func<string, IDomainRepository<ManualInput, ManualEntity>>>()
.ToMethod(ctx => name => kernel.Get<IDomainRepository<ManualInput, ManualEntity>>(name));
但是对于Func injection
,我无法使用open generics
,因此我创建了基于封闭的泛型绑定,这导致了很多绑定代码(因为有300 +实体),是否可以:
编辑1 :(为什么命名为绑定)
命名绑定的原因是,我需要将几个IDomainRepository
绑定重定向到另一个类,这需要在数据和域实体之间进行自动映射,在其他情况下,则是要提取多个域实体, (它们具有相同数量的通用类型,可以在运行时针对不同的功能进行解析),例如:
映射以获取2个域实体
kernel.Bind<Func<string, IDomainRepository<ManualInput, ManualEntity1,ManualEntity2>>>()
.ToMethod(ctx => name => kernel.Get<IDomainRepository<ManualInput, ManualEntity1,ManualEntity2>>(name));
映射以获取1个域实体,该域实体是使用AutoMapper从数据实体映射的。
kernel.Bind<Func<string, IDomainRepository<ManualInput, ManualEntity, ManualEntityData>>>()
.ToMethod(ctx => name => kernel.Get<IDomainRepository<ManualInput, ManualEntity, ManualEntityData>>(name));