我的解决方案中的项目设置如下:
在App.Data中,我正在使用Entity Framework通过一堆存储库来访问我的数据,以抽象与它的交互。出于显而易见的原因,我希望我的App.Web仅引用App.Data项目,而不是实体框架。
我正在使用Constructor Injection为我的控制器提供对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
对象(继承自实体框架的DbContext
),所有子存储库将使用该对象来访问数据库。
最后我们来讨论我的问题:我如何在DataRepository
上使用构造函数注入,因为它是一个代码库并且没有入口点?我无法引导{{1在App.Web中因为那时我必须从该项目引用实体框架。
或者我只是在做一些愚蠢的事情?
答案 0 :(得分:12)
您可以在RepositoryConnection
中定义一个App.Data
类作为Context的包装器,并且无需在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;
}
// ...
}