2017-02-05 2 views

답변

1

일하는 것이 종속 injection를 사용하여 할 수있는 간단한 방법을 보여줍니다 Github에 샘플 프로젝트가있다.

2

서비스가 잠재적으로 공유에 액세스하는 여러 개의 동시 통화를합니다

internal static class InstanceAccessor 
{ 
    internal static StatefulService ActiveInstance { get; set; } 
} 

을 그리고 StatefulService의 RunAsync 방법 내부의 값을 넣어 :

현재 나는 이것에 대한 작은 클래스를 사용하고 있습니다 예를 들어, 코드에서 RunAsync가 인스턴스를 설정하기 전에 WebApi에 대한 요청이 실행될 수는 있습니다 (그러나 약간은있을 수 있습니다). 과제의 .ctor로 과제를 옮길 수 있습니다. 하지만 인스턴스를 설정 한 후에는 충돌에 대해 걱정할 필요가없는 공유 인스턴스 만 읽습니다.

이 솔루션의 문제점은 테스트 가능성입니다. WebAPi에 대한 단위 테스트를 작성하려는 경우 공유 인스턴스에 종속성이 있습니다. 이에 대한 자세한 내용은 다음을 참조하십시오. Unit testing with singletons

의존성 주입 및 IoC 컨테이너로 작업하는 또 다른 방법이 있습니다. 모든 종속성 (서비스 포함)에 대한 참조가있는 컨테이너로 WebApi 컨트롤러를 구성하도록 설정할 수 있습니다. Service Fabric/WebApi에 대한 IoC 및 Dependency Injection 설정은 여기 https://stackoverflow.com/a/41980513/1062217에 설명 된대로 수행 할 수 있습니다. 제어기 .ctor에있는 StatefulService에 의존성을 추가하기 만하면됩니다.

public SomeApiController(StatefulService service) 
{ 
    _service = service; 
} 

그리고 그것은 단지 당신이 WebApi 컨트롤러에 필요한 Statemanager이 구현 테스트하고 당신이 단지를 가지고가는 경우에 유지하기 쉬울 것 인 경우,

public WebApiService(StatefulServiceContext context) 
    : base(context) 
{ 
    Container = new TinyIoCContainer(); 
    Container.Register<StatefulService>(this); 
} 

그러나 용기에 서비스를 등록 StateManager에 의존 :

public SomeApiController(IReliableStateManagerReplica stateManager) 
{ 
    _stateManager = stateManager; 
} 

와 서비스 .ctor에 그 등록 :

,536,913 63,210
public WebApiService(StatefulServiceContext context) 
    : base(context) 
{ 
    Container = new TinyIoCContainer(); 
    Container.Register<IReliableStateManagerReplica>(this.StateManager); 
} 

노트,이 예제는 TinyIoC를 사용하지만, 어떤 IoC 컨테이너는

관련 문제