2016-06-16 20 views
1

Asp.Net WebAPIのすべてのコントローラ/アクションメソッド間でシングルトン共有オブジェクトを公開する必要があります。このようなグローバルな静的オブジェクトを宣言して、すべてのコントローラ/アクションメソッドがそのオブジェクトにアクセスできるようにするには、どの場所が最適ですか?すべてのAPIコントローラ/アクションメソッドで共有されるグローバル静的オブジェクト

+0

ライブラリーを作成してそこにシングルトンを入れてください –

+3

**静的オブジェクトまたはシングルトンを使用しないでください** ** * *使用しないでください! ASP.NET MVCは依存性注入をサポートしています。 –

+0

すべての答えをお寄せいただきありがとうございます。 –

答えて

2

Lazy<T>を使用できます。これは、スレッドの安全性を確保します:

public class Greeter 
{ 
    public static readonly Lazy<Greeter> Instance = new Lazy<Greeter>(() => new Greeter()); 

    public Greeter() 
    { 
     // I am called once during the applications lifetime 
    } 

    public string Greet(string name) 
    { 
     return $"Hello {name}!"; 
    } 
} 

は、その後、あなたが好きな場所にこれを使用します。

public class GreetController : ApiController 
{ 
    public IHttpActionResult Get(string name) 
    { 
     var message = Greeter.Instance.Value.Greet(name); 

     return Ok(message); 
    } 
} 
1

あなたのWebApiApplication(Global.asax.cs)内の変数を宣言すると、コードとすべてのコントローラでそれを使用することができます。

var globalValue = (HttpContext.Current.ApplicationInstance as WebApiApplication).GlobalVariableName; 

しかし、あなたは、オーバーヘッド取得しますので、私のためとして、それは、最善の方法ではありません初期化と設定値で、またアーキテクチャの問題のように見えます。

なぜグローバルオブジェクトが必要ですか? 新しい親コントローラを宣言してこの関数を宣言する関数がある場合は、 読み取り専用のデータが必要な場合は、web.cofigに入力してください。

2

を「最善」の方法は、DI(依存性注入)コンテナを使用して、コントローラにシングルトンを注入することですそれを必要とする。私はNinjectを使っていますので、これを使っていますが、あなたが決めるコンテナにコードを簡単に適応させることができます。すなわち

NinjectWebCommon.cs

kernel.Bind<MySingleton>().ToSelf().InSingletonScope(); 

コントローラ(S)

public class FooController : ApiController 
{ 
    protected readonly MySingleton mySingleton; 

    public FooController(MySingleton mySingleton) 
    { 
     this.mySingleton = mySingleton; 
    } 
} 

、DIコンテナはシングルトンを管理します。あなたのコントローラーは、シングルトンをコンストラクターパラメーターとして受け入れ、コントローラーに設定します。 DIコンテナはシングルトンをコントローラに注入し、コントローラの他のメンバと同じように自由に使用することができます。

関連する問題