2010-12-02 41 views
1

私のアプリケーションでは、モデルはデータベースを表すデータセットであるため、アプリケーションの実行中の任意の時点でモデルオブジェクトは1つのみです。現在のところ、これはアプリケーション起動時に作成され、アプリケーションクラスにプロパティとして保存されます。ビューモデルは、コンストラクタを介してデータセット/モデルへの参照を受け取ります。MVVM - ビューモデルへのモデルの注入とシングルトンによるモデルの取得

データセットが1つしかない場合があるので、データセットを作成/返すシングルトンクラスを実装し、ビューモデルに参照を取得させる方がよいでしょうか(このアプローチに問題はありますか)

おかげで、 ジェームズ

答えて

4

私の個人的な経験から、これはrocksolidアプローチです:

  1. あなたが望むもので、人生が容易になりますが、それは世界的に利用可能なデータセット
  2. の複数のインスタンスのインスタンス化を防ぎます

しかし、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

+0

ありがとう、一般的なシングルトンは便利なツールのように見えます。あなたは、メインアプリケーションクラスの静的プロパティを介してデータセットを公開するなど、シングルトンの使用をアドバイスしますか? – Moonshield

+0

あなたが言うことができるなら、私のアプリケーションクラス(おそらく静的クラスかシングルトンか)はすべてのモデルクラスのための必須の依存性です、そして、静的プロパティはokですが推奨されません。ジェネリックシングルトンは、特定のモデルクラスをシングルトンデータセットインスタンス(シングルトンとして持っていたい場合)にのみ結合し、アプリケーションクラスなしでも使用できます。だから私はシングルトンをお勧めしたい。静的プロパティの強さは単純さのため、アプリケーションの複雑さによって決定する必要があります。 – Falcon

+0

ありがとう、私はいくつかの考えを与えるだろう。 – Moonshield

4

コンストラクタでそれをより柔軟になることを持ちます。実際には、シングルトンを実装し、同じシングルトンインスタンスを常に継承したり、DIフレームワークを使用してシングルトンとして保持することができます。

これにより、ViewModelはユニットのテストを容易にするモデルの寿命を知ることができなくなります。

データセットには1つのものがありますが、それらは緩んでいるためモデルではありません。データセットを使用する必要がある場合でも、エンティティクラスモデルを作成して翻訳していました。データセットはDDDではありません。

+0

申し訳ありません:?静的メンバーとシングルトンとしてそれらを実装しますか – Moonshield

+0

申し訳ありませんが、それはモデルのルールと制約を強制するものではなく、何かを含むことができることを意味します。 – Aliostad

+0

ああ、そうだ。この場合、アプリケーションは主に、他のアプリケーションのスイートで使用するために構成データをデータベースに入力するためのフロントエンドであるため、参照整合性と型チェック(型指定されたデータセット)がそこに適用されます。私はあなたのポイントを見て、私は確かにそれがもっと必要な他のアプリケーションでより実質的なモデルを採用します。 – Moonshield

関連する問題