DI, конкретный класс с абстрактным родовым родителем - PullRequest
0 голосов
/ 14 ноября 2018

Мы используем .NET Core Dependency Injection и имеем следующую структуру классов

public interface IValidator<TEntity, TMessageKey> {
   ValidationResult<TMessageKey> Validate(TEntity entityToValidate);
}

public abstract class BaseValidator<TEntity, TMessageKey> : IValidator<TEntity, TMessageKey> {
  // code omitted
}

public class ConcreteValidator : BaseValidator<ConcerteEntity, MyMessageKey> 
{
  // code omitted
}

Конечно, может быть много конкретных валидаторов, и я хочу их зарегистрировать в пакетном режиме.

Как быЯ достигаю этого?

По сути, я хочу зарегистрировать несколько закрытых универсальных типов в одном открытом универсальном типе.

Все, что я пробовал, до сих пор не удавалось.

  • Регистрация BaseValidator<,> в `ConcreteValidator
  • Регистрация IValidator<,> в BaseValidator<,>

Я уже прочитал несколько статей / сообщений об этом, и яЯ даже не уверен, возможно ли это с DI ядра *.

РЕДАКТИРОВАТЬ: Вот моя последняя попытка (я использую расширение NetCore.AutoRegisterDi)

var data = services.RegisterAssemblyPublicNonGenericClasses(Assembly.GetExecutingAssembly())
                .Where(x => x.BaseType.IsGenericType && x.BaseType.GetGenericTypeDefinition() == typeof(BaseValidator<,>));

foreach(var d in data.TypesToConsider)
{
   var type = typeof(BaseValidator<,>);
   var genericType = type.MakeGenericType(d.BaseType.GenericTypeArguments);
   services.AddScoped(genericType, d);
}
...