내가 성 윈저에 새로운 오전, 그래서 나는 단순히 여기에 명백한 기능을 놓친 경우에 저를 용서 ...성 윈저 - 과도 구성 요소의 제어 생성
나는 현재 성 순수한 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 인스턴스가 컨테이너에 등록되지 않았고 그 것이 맞는지 아닌지 잘 모르겠습니다 .
모든 의견, 아이디어 및 제안을 주시면 감사하겠습니다.
그 I 몰랐다. 그런데 코드가 작동하도록하려면 Resolve 메서드에서 "new"키워드를 제거 할 수 있습니까? –
아 약간 실수. 감사 –