서비스가 잠재적으로 공유에 액세스하는 여러 개의 동시 통화를합니다
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 컨테이너는