2017-05-15 1 views
1

여러 스레드에서 요구하는 종속성을 관리하는 데 dryioc을 사용하고 싶습니다. 종속성이 ioc에 의해 해결되어야하는 각 작업을 전달하는 스레드를 시작하고 싶습니다. 이것이 어떤 도움이 이상적으로 보일 것 인 지 확실하지 않습니다.Dryioc 및 다중 스레드

+0

(https://bitbucket.org/dadhi/dryioc/overview) : _Thread- 안전하고 lock-free - 등록 및 해결은 컨테이너 상태를 손상시키지 않고 병행하여 진행될 수 있습니다. _ - 진술이 사실이라면 걱정없이 스레드로부터 자유롭게 종속성을 주입 할 수 있어야합니다. 행운을 빕니다! – BlueStrat

답변

1

당신이 필요로하는 경우 서비스는 다음 스레드 (스레드 당 단일 인스턴스)에 범위 컨테이너 ThreadScopeContext을 설정

RootContainer = new Container(scopeContext: new ThreadScopeContext()); 

RootContainer.Register<IService, MyService>(Reuse.InCurrentScope); 

// in your thread 
using (RootContainer.OpenScope()) 
{ 
    var service = RootContainer.Resolve<IService>(); 
    // use the service 
} 

새로운 스레드에서 라이브 시작하지만 다음 같은 인스턴스를 전파 서비스가 필요한 경우 async/await 호출 (가능하면 다른 스레드에서)을 통해 AsyncExecutionFlowScopeContext을 사용하십시오.

DryIoc의 범위 컨텍스트는 오픈 스코프를 저장할 수있는 컨테이너와 독립적 인 제 3 자 개체입니다 (예 : 스레드 정적 또는 AsyncLocal 변수입니다.

다른 방법 (기본 동작)은 열린 범위를 범위의 새 컨테이너과 연결하는 것이지만 해결하려면이 새 컨테이너에 대한 참조가 필요합니다. 여기에 나는 어떤 범위 컨텍스트를 사용하지만, scopedContainer에서 대신 루트 하나 해결해야하고 있지 않다면 : [DryIoc 위키]에서

RootContainer = new Container(); // without ambient scope context 

RootContainer.Register<IService, MyService>(Reuse.InCurrentScope); 

// in your thread 
using (var scopedContainer = RootContainer.OpenScope()) 
{ 
    var service = scopedContainer.Resolve<IService>(); 
    // use the service 
}