У меня есть интерфейс IBase со многими производными интерфейсами IDerived1, IDerived2. Я хотел бы зарегистрировать реализации производных интерфейсов с помощью Autofac.
Для любого производного интерфейса я могу написать метод разрешения для этого интерфейса. Мне интересно, есть ли способ избежать перечисления списка всех производных интерфейсов при создании контейнера?
Что у меня есть сейчас:
public static void Register<TDerived>(ContainerBuilder b) where TDerived : IBase {
b.Register(cc => DerivedFactory.Create<TDerived>(cc.Resolve<SomeDependency>())
.As<TDerived>()
.InstancePerLifetimeScope();
}
// in my registration method
ContainerBuilder b = ...
MethodInfo genericRegisterDerivedMethod = this.GetType().GetMethod("Register", BindingFlags.Public | BindingFlags.Static);
List<Type> allDerivedInterfaces = /* query across various assemblies for interfaces which extend IBase */
allDerivedInterfaces.ForEach(t => genericRegisterDerivedMethod
.MakeGenericMethod(t)
.Invoke(null, new object[] { b })
);
То, что я хотел бы иметь, это:
public static void Create<TDerived>(IComponentContext cc) where TDerived : IBase {
return DerivedFactory.Create<TDerived>(cc.Resolve<SomeDependency>());
}
// in my registration method
ContainerBuilder b = ...
MethodInfo genericResolveDerivedMethod = this.GetType().GetMethod("Create", BindingFlags.Public | BindingFlags.Static);
b.RegisterDerivedTypesOf<IBase>((cc, t) => (IBase)genericResolveDerivedMethod
.MakeGenericMethod(t)
.Invoke(null, new object[] { cc, t })
);
Это избавило бы меня от необходимости знать полный список интерфейсов IDerived при запуске приложений. Это возможно?