2017-09-28 3 views
2

私は現在、SQLサーバーからC#WPFアプリケーションにデータを渡しています。プリズムとEntity Frameworkを使用してDBContextを取得しています(問題がある場合はデータベース第1世代を使用します)。私は成長プロジェクトを持っています。ここでは、さまざまなプロジェクトのさまざまな画面から一度にこのサーバーに接続するつもりです。EF DBContextオブジェクトを独自のモジュール内に保持し、DIで取得する必要がありますか?

最初は、それぞれのViewModelに対して新しいDBContextオブジェクトを作成しましたが、私は、相互の変更について知らない別のインスタンスのコンテキストについてオンラインで読むのは正しいことではないという感覚がありました。

私はDIを使用して、この同じDBContextの静的インスタンスを、そのコンストラクタのインタフェースを要求する任意の画面のViewModelに持ち込みます。私はそれがかなり単純な変更だと思うが、私は確かにそれがこのように優れていると言うことができるか分からない。

この例は、Entity Frameworkによって生成される共通のDBContextオブジェクトを共有するための許容される方法ですか?そうでない場合は、どうすれば変更できますか?ありがとう!

public interface ICommonContext 
{ 
    ServerEntities Context { get; } 
} 

public class CommonContext : IModule, ICommonContext 
{ 
    private static ServerEntities _context; 
    public ServerEntities Context 
    { 
    get { return _context; } 
    } 

    public void Initialize() { _context = new ServerEntities(); } 
} 

/// When used in a VM /// 
private ServerEntities _model; 

public SomeViewModel(ICommonContext cc){ 
    _model = cc.Context; 
} 
////////////////////////// 

答えて

2

これは、我々は何をすべきか本質的です。私は実際にはEF(より多くのTFSと分岐)を取り扱う時間の苦痛を感じました。主に異なるバージョンのデータベースを持っているためです。したがって、EFモデルは本質的に各バージョンで変更することができます。 DIを使用すると、定義したインタフェースを実装するすべてのクラスを渡すことができます。これは、特にテストケースなどを書くことに決めた場合に有益です。

短いストーリー、DIは間違いなく道のりです。私はさらにそれを一歩踏み出し、あなたのフォームからあなたのDbContextを切り離し、フォームに注入するリポジトリのようなものを使用します。そうすれば、あなたのフォームはあなたのDbContextやデータがどこから来るのかを知る必要はありません。これは、プロジェクトが大きくなったり、複数のソースがある場合や、EFを廃止して何か他のことをする場合に役立ちます。

静的コンテキストの使用については、Gertの答えを参照してください。彼は有効なポイントを提示します。私の答えはDIのためのケースを構築することに向けられています。間違いなく静的コンテキストルートを慎重に行ってください。 Check this article.

+0

ええ、あなたは良い点を挙げました。私は私の答えを編集しました。 – Cory

2

静的コンテキストの使用は悪いです。それをしないでください。

しかし、WPFのようなリッチクライアントアプリケーションでは、1つのビューモデルにつき1つのウィンドウインスタンスあたりのコンテキストを持つことはかなり一般的なパターンです。したがって、DIコンテナにコンテキストをインスタンスライフサイクルで登録し、コンストラクタインジェクションによってビューモデルに注入するだけです。

意味:クラスを削除してくださいCommonContext

+0

良い点は、私は静的コンテキストを使うことの短所について考えなかった。私はDIを見て、喜んでしまった。 – Cory

関連する問題