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