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'입니까? 당신은 generics 언급하지 않은 질문 ... – nemesv

+0

@nemesv : 나는 MethodInfos에 대한 자세한 내용을 제공하는 질문을 편집했습니다. – ChaseMedallion

+0

'DerivedFactory.Create '을 호출 할 필요가 없다면 Autofac이 도움이 될 것입니다. 일반적인 생성자 주입 대신에 정적 팩토리를 호출해야하는 이유가 있습니까? –

답변

0

요청 된 인터페이스 서비스 유형 인 IDerived마다 즉시 등록을 작성할 수있는 사용자 정의 등록 소스를 사용하여이 문제를 해결할 수있었습니다.