Ninject的Func <string,t>委托注入使用开放式泛型

时间:2019-01-21 09:29:00

标签: c# dependency-injection inversion-of-control ninject ioc-container

以下是我的界面设计:

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. 将Func委托与开放泛型一起使用吗?
  2. 是否可以替换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));

0 个答案:

没有答案