2017-02-05 9 views
3

WebAPIをステートフルサブティブに追加し、StateManagerStatefulServiceクラス実装外)にアクセスしたいとします。Azure Service Fabricステートフルサービス状態にアクセスする

どのような方法が最適ですか?

現在、私は、このための小さなクラスを使用しています:

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

そしてStatefulServiceのRunAsyncメソッドの内部で値を入れる:

protected override async Task RunAsync(CancellationToken cancellationToken) 
{ 
    InstanceAccessor.ActiveInstance = this; 
    ... 

答えて

1

働くだろう依存injectionを使用してそれを行うための簡単な方法を示してGithub上のサンプルプロジェクトがあります。

2

あなたのサービスが潜在的に共有にアクセスする複数の同時呼び出しを持っていますインスタンスでは、RunAsyncがインスタンスを設定する前に、WebApiへの要求が実行される可能性があります(ただし、わずかです)。あなたはサービスの.ctorに課題を移すことができます。しかし、それは読んでいるだけなので、インスタンスを設定した後に、競合について心配する必要がない共有インスタンスに行います。

このソリューションの問題は、テスト容易性です。あなたのWebAPiの単体テストを書く場合は、という硬いの共有インスタンスに依存します。 Unit testing with singletons

依存関係注入とIoCコンテナで作業する別の方法があります。すべての依存関係(サービスを含む)への参照を持つコンテナによってWebApiコントローラを構築するように設定できます。サービスファブリック/ WebApiのIoCと依存性注入のセットアップは、https://stackoverflow.com/a/41980513/1062217の説明に従って行うことができます。コントローラ.ctorStatefulServiceに依存関係を追加するだけです。

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コンテナは

関連する問題