あなたのサービスが潜在的に共有にアクセスする複数の同時呼び出しを持っていますインスタンスでは、RunAsyncがインスタンスを設定する前に、WebApiへの要求が実行される可能性があります(ただし、わずかです)。あなたはサービスの.ctorに課題を移すことができます。しかし、それは読んでいるだけなので、インスタンスを設定した後に、競合について心配する必要がない共有インスタンスに行います。
このソリューションの問題は、テスト容易性です。あなたのWebAPiの単体テストを書く場合は、という硬いの共有インスタンスに依存します。 Unit testing with singletons
依存関係注入とIoCコンテナで作業する別の方法があります。すべての依存関係(サービスを含む)への参照を持つコンテナによってWebApiコントローラを構築するように設定できます。サービスファブリック/ WebApiのIoCと依存性注入のセットアップは、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にそれを登録します。
public WebApiService(StatefulServiceContext context)
: base(context)
{
Container = new TinyIoCContainer();
Container.Register<IReliableStateManagerReplica>(this.StateManager);
}
ノートでは、この例ではTinyIoCを使用していますが、任意のIoCコンテナは