Ниже приведен мой дизайн интерфейса:
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));