2013-05-21 2 views
0

У меня есть интерфейс 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 при запуске приложения , Это возможно?

+1

Что такое 'genericRegisterDerivedMethod'? Вы не упомянули дженерики, это ваш вопрос ... – nemesv

+0

@nemesv: Я отредактировал вопрос, чтобы предоставить более подробную информацию о MethodInfos. – ChaseMedallion

+0

Если вам не нужно было вызывать 'DerivedFactory.Create ' Autofac, возможно, поможет вам здесь ... есть ли причина, по которой вам нужно вызвать статическую фабрику вместо обычной инъекции конструктора? –

ответ

0

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

Смежные вопросы