2016-06-21 1 views
0

두 개의 클래스가있는 시나리오가 있습니다. 각각 SingletonWorkerScopedWorker이라고하며, Singleton 및 Scoped 라이프 스타일에 각각 등록하십시오. 둘 다 그들의 생성자에 IMetricSubmitter에 의존합니다. 작업자는 IMetricSubmitter을 사용하여 로직의 일부로 메트릭을 제출합니다. SingletonWorkerDefaultMetricSubmitter와 종료되고 ScopedWorkerEnrichMetricsDecoratorDefaultMetricSubmitter 장식으로 끝날 것 같은 것을 내가 ScopedWorker 의존성의 목적을 위해 EnrichMetricsDecorator로 장식하고자 DefaultMetricSubmitter라는 IMetricSubmitter위한 싱글 구현은,있다. 오늘 SimpleInjector를 사용하여 그러한 등록을 만드는 방법이 있습니까?Simple Injector를 사용하여 소비자 라이프 스타일에 따라 조건부로 데코레이터를 등록하는 방법은 무엇입니까?

객체 그래프는 기본적으로 다음과 같아야합니다 : 나에게

var singleton = new SingletonWorker(
    new DefaultMetricSubmitter()); 

var scoped = new ScopedWorker(
    new EnrichMetricsDecorator(
     new DefaultMetricSubmitter())); 

는 데코레이터를 등록하는 방법이다 RegisterDecorator과 소비자에 대해 알고 술어가있는 RegisterConditional을, 결합처럼 보이지만 두 가지를 결합하는 방법을 모르겠습니다. 이상적으로 컨디셔닝 디자이너가 소비 생성자에 대한 종속성으로 요청 될 때 활성 범위가 있는지 여부에 따라 조건을 등록하고 싶을 경우이 활성 범위에 대한 데코레이터 인스턴스를 만듭니다. 논쟁의 목적 상 범위는 LifetimeScope으로 가정 할 수 있습니다.

답변

1

RegisterDecorator 방법으로는 원하는 것을 수행 할 수 없습니다. 대신 RegisterConditional 방법을 사용하도록 되돌려 야합니다.

container.Register<ScopedWorker>(Lifestyle.Scoped); 
container.Register<SingletonWorker>(Lifestyle.Singleton); 

container.RegisterConditional<IMetricSubmitter, EnrichMetricsDecorator>(
    Lifestyle.Scoped, 
    c => c.Consumer.ImplementationType == typeof(ScopedWorker)); 

container.RegisterConditional<IMetricSubmitter, DefaultMetricSubmitter>(
    Lifestyle.Singleton, 
    c => c.Consumer.ImplementationType == typeof(EnrichMetricsDecorator)); 

이 연습이 문서에 here를 설명 : 당신의 지정된 객체 그래프를 고려하면, 이러한 등록은 다음과 같이 될 것이다.

UPDATE 업데이트 된 개체 그래프 (즉 별도의 싱글 장식 포함)로 보일 수 있습니다 등록이 다음으로

이 등록이되어 있지 않습니다 문서에 따르면

// Useful helper method 
static bool InjectedInto<TConsumer>(PredicateContext c) => 
    c.Consumer.ImplementationType == typeof(TConsumer); 

container.Register<ScopedWorker>(Lifestyle.Scoped); 
container.Register<SingletonWorker>(Lifestyle.Singleton); 

container.RegisterConditional<IMetricSubmitter, DefaultMetricSubmitter>(
    Lifestyle.Singleton, 
    InjectedInto<CachingMetricSubmitterDecorator>); 

container.RegisterConditional<IMetricSubmitter, CachingMetricSubmitterDecorator>(
    Lifestyle.Singleton, 
    c=> !InjectedInto<ScopedWorker>(c)&&!InjectedInto<CachingMetricSubmitterDecorator>(c)); 

container.RegisterConditional<IMetricSubmitter, EnrichMetricsDecorator>(
    Lifestyle.Scoped, 
    InjectedInto<ScopedWorker>); 
+0

' EnrichMetricsDecorator'가 싱글턴'DefaultMetricsSubmitter'을 장식했는데, 내가 잘못한거야? – Eldar

+0

죄송합니다. 잘 읽지 않았습니다. 정확히 내가 필요로하는 것을보고, 그것을 조사 할 것이다. 감사합니다 :) – Eldar

+0

안녕하세요 스티븐, 귀하의 제안을 일했지만 내가 좀 더 복잡한 개체 그래프를 어디에 그것이 실패합니다. 위의 예제를 계속 진행하면,'DefaultMetricSubmitter'는 항상 싱글 톤'CachingMetricSubmitterDecorator'으로 장식되어야하고,'CachingMetricSubmitterDecorator'는 소비자가'Scoped' 라이프 스타일을 갖는 조건에 따라'EnrichMetricsDecorator'로 장식되어야합니다. 그래서'SingletonWorker'는'DefaultMetricsSubmitter'를 꾸미는'CachingMetricSubmitterDecorator'를 받아야합니다. 어떻게 접근해야합니까? – Eldar

관련 문제