2012-03-14 3 views
3

Autofac을 사용하여 구성 요소를 등록하고 특정 종속성을 명명 된 인스턴스로 지정하도록 지정합니다.Autofac : 명명 된 인스턴스에 특정 종속성 확인

나는 거의 내가 원하는 생성자 주입을 사용하여 다음과 같은 샘플을 발견했다.

builder.Register(c => new ObjectContainer(ConnectionStrings.CustomerDB)) 
    .As<IObjectContainer>() 
    .Named("CustomerObjectContainer"); 

builder.Register(c => new ObjectContainer(ConnectionStrings.FooDB)) 
    .As<IObjectContainer>() 
    .Named("FooObjectContainer"); 

builder.Register(c => new CustomerRepository(
    c.Resolve<IObjectContainer>("CustomerObjectContainer")); 

builder.Register(c => new FooRepository(
    c.Resolve<IObjectContainer>("FooObjectContainer")); 

는 그러나, 나는 재산 주입이 필요하고 나는 모든 종속성을 지정하지 않습니다. 같은

뭔가 : 모든 지정되지 않은 dependnecies의

builder.Register<CustomerRepository>().With<IObjectContainer>("CustomerObjectContainer");  
builder.Register<FooRepository>().With<IObjectContainer>("FooObjectContainer"); 

빌드 업 익명의 인스턴스로 발생한다.

덕분에, 알렉스

[Danielg의 답에 추가]

과부하 해당 유형의 속성 유형에 의해 해결한다.

public static IRegistrationBuilder<TLimit, TReflectionActivatorData, TStyle> WithDependency<TLimit, TReflectionActivatorData, TStyle, TProperty>(
     this IRegistrationBuilder<TLimit, TReflectionActivatorData, TStyle> registration, 
     Func<IComponentContext, TProperty> valueProvider) 
     where TReflectionActivatorData : ReflectionActivatorData 
    { 
     return registration.WithProperty(new ResolvedParameter((p, c) => 
      { 
       PropertyInfo prop; 
       return p.TryGetDeclaringProperty(out prop) && 
        prop.PropertyType == typeof(TProperty); 
      }, 
      (p, c) => valueProvider(c))); 
    } 

답변

5

필자는 autofac이 아직이 작업을 수행하는 약식 방법이 없다고 생각하지만 약간의 노력으로 가능합니다.

이 작업을 수행하는 확장 방법을 작성했습니다. 정적 확장 클래스에서 그것을 던져 당신은 잘되어야합니다. 이 확장은 또한이 일을하는 방법을 보여줍니다.

public static IRegistrationBuilder<TLimit, TReflectionActivatorData, TStyle> WithResolvedProperty<TLimit, TReflectionActivatorData, TStyle, TProperty>(
    this IRegistrationBuilder<TLimit, TReflectionActivatorData, TStyle> registration, 
    string propertyName, Func<IComponentContext, TProperty> valueProvider) 
     where TReflectionActivatorData : ReflectionActivatorData 
{ 
    return registration.WithProperty(new ResolvedParameter((p, c) => 
                   { 
                    PropertyInfo prop; 
                    return p.TryGetDeclaringProperty(out prop) && 
                      prop.Name == propertyName; 
                   }, 
                  (p, c) => valueProvider(c))); 
} 

슈퍼 긴 메소드 서명을 신경 쓰지 마, autofac 등록은 매우 상세하다.

이와 같은 확장 프로그램을 사용할 수 있습니다.

builder.RegisterType<Foo>() 
    .WithResolvedProperty("Bar", c => c.Resolve<IBar>()); 
관련 문제