7

プロジェクトは、このように設定されていますジェクトDbContextは私の溶液中の

  • App.Data
  • App.Models
  • App.Webアプリで

。データ、私はエンティティフレームワークを使用して、抽象的な相互作用にリポジトリの束で自分のデータにアクセスしています。明らかな理由から、私はApp.Webに、Entity FrameworkではなくApp.Dataプロジェクトのみを参照させたいと思います。私は私のコントローラのようになりますリポジトリコンテナへの参照を与えるためにコンストラクタ・インジェクションを使用してい

public interface IDataRepository 
{ 
    IUserRepository User { get; set; } 
    IProductRepository Product { get; set; } 

    // ... 
} 

public class DataRepository : IDataRepository 
{ 
    private readonly AppContext _context; 

    public DataRepository(AppContext context) 
    { 
     _context = context; 
    } 

    // ... 
} 

DataRepositoryは(Entity FrameworkののDbContextから継承)AppContextオブジェクトを持つことになりますが、そのすべての子リポジトリはデータベースへのアクセスに使用します。

最終的に私は私の問題に遭遇します:DataRepositoryでコンストラクタインジェクションをどのように使うのですか?それはコードライブラリでエントリーポイントはありません。AppContextをApp.Webでブートストラップすることはできません。なぜなら、そのプロジェクトからEntity Frameworkを参照する必要があるからです。

私は何かばかげているのですか?

+0

ないあなたの質問への答え簡略化した例であるが、代わりにリポジトリインタフェースの多くを定義する、単一 'IRepository 'インタフェースを定義してみてください/www.cuttingedge.it/blogs/steven/pivot/entry.php?id=92)。これにより、より多くの柔軟性が可能になります。 – Steven

+3

@Stevenご意見ありがとうございます。 「リポジトリはモデル化されているドメインの一部であり、そのドメインは一般的ではありません。すべてのエンティティを削除できるわけではなく、すべてのエンティティを追加できるわけではなく、すべてのエンティティにリポジトリがあります」。 http://stackoverflow.com/questions/1230571/advantage-of-creating-a-generic-repository-vs-specific-repository-for-each-obje – ajbeaven

答えて

12

コンテキストにラッパーとして機能するApp.DataRepositoryConnectionクラスを定義し、App.WebのEFを参照する必要がなくなります。 IoCコンテナを使用している場合は、RepositoryConnectionクラスの有効期間を制御して、Repositoryのすべてのインスタンスが同じContextを取得するようにすることができます。 /:[ここ](HTTPで説明したように、これは...

public class RepositoryConnection 
{ 
    private readonly AppContext _context; 

    public RepositoryConnection() 
    { 
     _context = new AppContext(); 
    } 

    public AppContext AppContext { get { return _context; } } 
} 

public class DataRepository : IDataRepository 
{ 
    private readonly AppContext _context; 

    public DataRepository(RepositoryConnection connection) 
    { 
     _context = connection.AppContext; 
    } 

// ... 
} 
+0

もちろん、ああ!この男をアップアップ! – ajbeaven

+0

すべてのクラスが同じコンテキストを取得している場合、誰もEFコンテキストを廃棄していません。これは悪いです。 EFコンテキストは、インスタンス化、使用、および廃棄するというアイデアで設計されています。 –

+0

@BrunoBrantあなたは絶対に正しいです - 「コンテキスト」はできるだけ短命でなければならず、この答えはそれを完全にサポートしています。アセンブリ間の 'ブリッジ'として動作する 'RepositoryConnection'を持っているという事実は何も変わりません。 'RepositoryConnection'とそれに伴う' Context'は**ウェブリクエストごと**に登録されています。それぞれの 'RepositoryConnection'(したがって' Context')は、単一のWebリクエストのスコープ内に存在するため、数秒で生き残ります。 Webリクエストが終了すると、DI管理クラスは範囲外になり、 'Disposed()'になります。 – qujck

関連する問題