以下是我的界面设计:
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多个实体),有没有办法:
-
对开放泛型使用func委托?
-
任何func委托的替换,因为这里我们在运行时传递命名绑定的名称,这就是为什么不能直接注入允许打开泛型的接口?
编辑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));