Как зарегистрировать все реализации открытого универсального интерфейса с помощью Autofac - PullRequest
0 голосов
/ 23 мая 2018

В настоящее время у меня есть интерфейс для одного шага в конвейере.

public interface IPipelineStep<T1, T2>
  where T1: ModelObject
  where T2: EntityObject { }

И у меня есть целая куча шагов, которые реализуют этот интерфейс:

public class ValidateModelStep<T1, T2> : IPipelineStep<T1, T2>
  where T1: ModelObject
  where T2: EntityObject { }

public class Step2<T1, T2> : IPipelineStep<T1, T2>
  where T1: ModelObject
  where T2: EntityObject { }

public class Step3<T1, T2> : IPipelineStep<T1, T2>
  where T1: ModelObject
  where T2: EntityObject { }

public class Step4<T1, T2> : IPipelineStep<T1, T2>
  where T1: ModelObject
  where T2: EntityObject { }

Я сейчас нахожусьрегистрируя их так:

builder.RegisterGeneric(typeof(ValidateModelStep<,>)).As(typeof(IPipelineStep<,>)).AsSelf();
builder.RegisterGeneric(typeof(Step2<,>)).As(typeof(IPipelineStep<,>)).AsSelf();
builder.RegisterGeneric(typeof(Step3<,>)).As(typeof(IPipelineStep<,>)).AsSelf();
builder.RegisterGeneric(typeof(Step4<,>)).As(typeof(IPipelineStep<,>)).AsSelf();

И тогда я могу использовать autofac для создания этих шагов.Проблема в том, что у меня много, много шагов.И очень жаль, что приходится регистрировать каждую из них каждый раз, когда я создаю новую.

Есть ли способ зарегистрировать их все сразу?

Я знаю, что вы можете использовать сканирование сборок и AsClosedTypesOf, но, похоже, это не работает для открытых универсальных реализаций открытых универсальных интерфейсов.

То, что я пробовал:

builder.RegisterAssemblyTypes(myAssembly).AsClosedTypesOf(typeof(IPipelineStep<,>)).AsImplementedInterfaces();

builder.RegisterAssemblyTypes(myAssembly).AssignableTo(typeof(IPipelineStep<,>)).As(typeof(IPipelineStep<,>)).AsSelf();

builder.RegisterAssemblyTypes(myAssembly)
.Where(t => t.IsAssignableFrom(typeof(IPipelineStep<,>)))
.As(typeof(IPipelineStep<,>)).AsSelf();

Есть ли способ использовать AsClosedTypesOf, когдаРеализация интерфейса также должна содержать дженерики?

Заранее спасибо

1 Ответ

0 голосов
/ 24 мая 2018

Полагаю, самый простой способ - это просто отсканировать сборку самостоятельно:

foreach (var t in myAssembly.GetTypes()
    .Where(c => !c.IsInterface && c.IsGenericTypeDefinition && c.GetInterfaces().Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IPipelineStep<,>)))) {
    builder.RegisterGeneric(t).As(typeof(IPipelineStep<,>)).AsSelf();
}

Это в основном фильтрует типы, которые являются общими, и реализуют IPipelineStep<>, затем регистрируется в контейнере.Я думаю, вы можете сделать то же самое с RegisterAssemblyTypes.Where(...), если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...