2017-10-04 6 views
2

내가 성 윈저에 새로운 오전, 그래서 나는 단순히 여기에 명백한 기능을 놓친 경우에 저를 용서 ...성 윈저 - 과도 구성 요소의 제어 생성

나는 현재 성 순수한 DI에서 작업 프로젝트를 전환하는 것을 시도하고있다 . 몇 가지 구성 요소가 있는데, ILogger 유형의 속성 종속성이 있습니다. 내 LoggerImpl이 같은 정적 팩토리 메소드를 통해 생성됩니다

, 오브젝트 트리를 구성 할 때 현재 ILogger입니다 의존성을 가지고 각 구성 요소 (순수한 DI)가 명명 된 로거를 수신

LoggerImpl.GetLogger("LoggerName"); 
예 :

var component1 = new MyComponent1(dependencies...); 
component.Logger = LoggerImpl.GetLogger("Component1Logger"); 
var component2 = new MyComponent2(dependencies...); 
component.Logger = LoggerImpl.GetLogger("Component2Logger"); 

Castle Windsor로 전환 한 후이를 참조하는 각 구성 요소에 대해 ILogger라는 싱글 톤을 등록한 다음 DependsOn (...)을 사용하여 해당 구성 요소에 해당 로거를 지정했습니다. 이 코드는 더 많거나 적은 같은 :

// register logger implementations 
container.Register(Component.For<ILogger>() 
    .ImplementedBy<RolexLogger>() 
    .Named("Component1Logger") 
    .UsingFactoryMethod(() => LoggerImpl.GetLogger("Component1Logger")); 
container.Register(Component.For<ILogger>() 
    .ImplementedBy<RolexLogger>() 
    .Named("Component2Logger") 
    .UsingFactoryMethod(() => LoggerImpl.GetLogger("Component2Logger")); 

// register component implementations 
container.Register(Component.For<IComponent1>() 
    .ImplementedBy<MyComponent1>() 
    .DependsOn(Dependency.OnComponent(typeof(ILogger), "Component1Logger"))); 
container.Register(Component.For<IComponent2>() 
    .ImplementedBy<MyComponent2>() 
    .DependsOn(Dependency.OnComponent(typeof(ILogger), "Component2Logger"))); 

모두 작동하는 것 같다,하지만이 작업을 수행하는 쉬운 방법이 있는지 궁금 해서요이? 이 코드는 엄청난 양의 코드처럼 보이는데, 더 많은 구성 요소가 로거를 필요로함에 따라 커지고 커질 것입니다.

Transient 라이프 스타일을 가진 LoggerImpl에 의해 단일 ILogger 구현을 등록 할 수 있는지 궁금해하고 ILogger에 대한 의존성이 해결 될 때마다 LoggerImpl의 인스턴스가 어떻게 생성되는지 제어합니다.

구성 요소를 등록 할 때 Dependency.OnValue (LoggerImpl.GetLogger ("LoggerName"))를 사용할 수 있다고 가정하지만 LoggerImpl 인스턴스가 컨테이너에 등록되지 않았고 그 것이 맞는지 아닌지 잘 모르겠습니다 .

모든 의견, 아이디어 및 제안을 주시면 감사하겠습니다.

답변

1

당신은 subresolver 사용할 수 있습니다

public class LoggerResolver : ISubDependencyResolver 
{ 
    public bool CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency) 
    { 
     return dependency.TargetType == typeof(ILogger); 
    } 

    public object Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency) 
    { 
     return LoggerImpl.GetLogger(model.Implementation.FullName); 
    } 
} 

당신의 등록의 이전에 커널에 추가보다

는 사실에 기능이었다 그래서 나는 :) 감사가 필요 정확히 무엇
container.Kernel.Resolver.AddSubResolver(new LoggerResolver()) 
+0

그 I 몰랐다. 그런데 코드가 작동하도록하려면 Resolve 메서드에서 "new"키워드를 제거 할 수 있습니까? –

+0

아 약간 실수. 감사 –