У меня есть интерфейс IBase со многими производными интерфейсами IDerived1, IDerived2. Я хотел бы зарегистрировать реализации для производных интерфейсов, используя Autofac.Полученные типы регистра 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 при запуске приложения , Это возможно?
Что такое 'genericRegisterDerivedMethod'? Вы не упомянули дженерики, это ваш вопрос ... – nemesv
@nemesv: Я отредактировал вопрос, чтобы предоставить более подробную информацию о MethodInfos. – ChaseMedallion
Если вам не нужно было вызывать 'DerivedFactory.Create' Autofac, возможно, поможет вам здесь ... есть ли причина, по которой вам нужно вызвать статическую фабрику вместо обычной инъекции конструктора? –