我的解决方案中的项目设置如下:
> App.Data
> App.Models
> App.Web
在App.Data中,我使用Entity Framework通过一堆存储库访问我的数据以抽象与它的交互.出于显而易见的原因,我希望我的App.Web仅引用App.Data项目,而不是Entity Framework.
我正在使用构造函数注入为我的控制器提供对如下所示的Repository容器的引用:
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对象(继承自Entity Framework的DbContext),所有子存储库将使用它来访问数据库.
最后我们来讨论我的问题:我如何在DataRepository上使用Constructor Injection,因为它是一个代码库并且没有入口点?我无法在App.Web中引导AppContext,因为那时我必须从该项目引用Entity Framework.
或者我只是在做一些愚蠢的事情?
解决方法
您可以在App.Data中定义RepositoryConnection类,该类充当Context的包装器,并且无需在App.Web中引用EF.如果您使用的是IoC容器,则可以控制RepositoryConnection类的生命周期,以确保Repository的所有实例都获得相同的Context.这是一个简化的例子……
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; } // ... }