7

在我的解決方案的項目設置是這樣的:與注射的DbContext到庫類庫

  • App.Data
  • App.Models
  • App.Web

在應用程序。數據,我使用實體框架來訪問我的數據與一堆存儲庫來抽象與它的交互。出於顯而易見的原因,我希望我的App.Web僅引用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將有AppContext對象(從實體框架的DbContext繼承),所有的孩子存儲庫將用於訪問數據庫。

因此,最後我們來到我的問題:考慮到它是一個代碼庫並沒有入口點,我該如何在DataRepository上使用構造函數注入?我無法在App.Web中引導AppContext,因爲那時我必須從該項目中引用實體框架。

或者我只是在做一些愚蠢的事情?

+0

不回答你的問題,但是,而不是定義了大量的資料庫界面,嘗試制定一個統一'IRepository '接口,解釋[這裏](HTTP:/ /www.cuttingedge.it/blogs/steven/pivot/entry.php?id=92)。這允許更多的靈活性。 – Steven 2013-05-10 08:48:56

+3

@Steven感謝您的評論。由於這個原因,我更喜歡特定的存儲庫:「存儲庫是被建模的域的一部分,並且該域不是通用的。不是每個實體都可以被刪除,不是每個實體都可以被添加,並不是每個實體都有一個存儲庫。 http://stackoverflow.com/questions/1230571/advantage-of-creating-a-generic-repository-vs-specific-repository-for-each-obje – ajbeaven 2013-05-10 08:53:24

回答

12

您可以在App.Data中定義一個RepositoryConnection類,該類用作上下文的包裝,並且不需要在App.Web中引用EF。如果您正在使用IoC容器,則可以控制RepositoryConnection類的生存期,以確保Repository的所有實例都獲得相同的上下文。這是一個簡單的例子...

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

啊當然! Upvote這個人! – ajbeaven 2013-05-10 09:13:24

+0

如果所有類都獲得相同的上下文,那麼沒有人會處置EF上下文,這很糟糕,非常糟糕。 EF上下文的設計思想是實例化,使用和處置。 – 2013-06-21 15:23:33

+0

@BrunoBrant你是絕對正確的 - 'Context'應該儘可能短,這個答案完全支持。事實上,我們有一個'RepositoryConnection'作爲組件之間的'橋樑「並不會改變任何東西。 'RepositoryConnection'和因此'Context'被註冊**每個Web請求**。每個'RepositoryConnection'(因此'Context')將存在於單個Web請求的範圍內,因此在幾秒鐘內就會存在。一旦Web請求完成,DI託管類將超出範圍,併成爲'Disposed()'。 – qujck 2013-06-21 17:59:16