私の個人的な経験から、これはrocksolidアプローチです:
- あなたが望むもので、人生が容易になりますが、それは世界的に利用可能なデータセット
- の複数のインスタンスのインスタンス化を防ぎます
しかし、OOP-Zealotは、クラシックなGang of Four Singleton(静的Instanceプロパティ付き)を使用すべきではないと主張しますが、DIコンテナによって1度だけ作成されたDI Singletonどこにでも通った。
個人的には、これはトレードオフです:GoFシングルトンは使いやすくシンプルです。私はそれを置き換えなければならなかったか、または一般的なデータベースアクセスとなるケースは一度もありませんでした。私はデータベースアクセスのためのインタフェースを持っています。必要があれば、シングルトン内の実装を変更することができます(また、実行時にも可能なように拡張します)。また、定型コードをたくさん保存することもできますが、モデルがデータベースに非常に密接に結合されており、モデルがなくては存在できないことに注意してください。
私が見ることができるDIの唯一のメリットは、DIのもう1つの利点であるデータベースアクセスのライフサイクル管理が変更されるのではないかと思われるため、外部設定から構成できることです。また、長期的にはObjectModelがよりクリーンに保たれるかもしれません。
私は個人的にはこのGeneric Singleton Implementationを使いたいと思います。オブジェクトフェティシズムの中には、シングルトンよりもラッパーが多いと主張する人もいますが、それは良い仕事をしていて、必要のない純粋なObjectModels(「ViewModelsとは対照的に、間違ってはいけません」)これは密な質問のビットですが、あなたは「緩い」とはどういう意味ない場合
public class Singleton<T> where T : class {
static object SyncRoot = new object();
static T instance;
public static T Instance {
get {
if (instance == null) {
lock (SyncRoot) {
if (instance == null) {
ConstructorInfo ci = typeof(T).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null);
if (ci == null) { throw new InvalidOperationException("class must contain a private constructor"); }
instance = (T)ci.Invoke(null);
}
}
}
return instance;
}
}
}
http://www.sanity-free.com/132/generic_singleton_pattern_in_csharp.html
ありがとう、一般的なシングルトンは便利なツールのように見えます。あなたは、メインアプリケーションクラスの静的プロパティを介してデータセットを公開するなど、シングルトンの使用をアドバイスしますか? – Moonshield
あなたが言うことができるなら、私のアプリケーションクラス(おそらく静的クラスかシングルトンか)はすべてのモデルクラスのための必須の依存性です、そして、静的プロパティはokですが推奨されません。ジェネリックシングルトンは、特定のモデルクラスをシングルトンデータセットインスタンス(シングルトンとして持っていたい場合)にのみ結合し、アプリケーションクラスなしでも使用できます。だから私はシングルトンをお勧めしたい。静的プロパティの強さは単純さのため、アプリケーションの複雑さによって決定する必要があります。 – Falcon
ありがとう、私はいくつかの考えを与えるだろう。 – Moonshield