FuncВнедрение делегата с использованием Ninject - PullRequest
0 голосов
/ 21 января 2019

Ниже приведен мой дизайн интерфейса:

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...