代码之家  ›  专栏  ›  技术社区  ›  Mrinal Kamboj

使用ninject的func<string,t>委托注入使用开放泛型

  •  3
  • Mrinal Kamboj  · 技术社区  · 7 年前

    以下是我的界面设计:

    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 回复  |  直到 7 年前