根据我的理解GenericRepository
继承自IGenericRepository
。它的属性为IDbFactory DbFactory
,DBCustomerEntities dbContext
和DBCustomerEntities DbContext
。我们使用DBCustomerEntities dbContext
Init
方法获取IDbFactory
的值,这实际上是初始化数据库。
我的问题是为什么需要构造函数GenericRepository
以及它的作用是什么?
public class GenericRepository<T> : IGenericRepository<T> where T : class
{
private DBCustomerEntities dbContext;
protected IDbFactory DbFactory
{ get; private set; }
protected DBCustomerEntities DbContext
{
get { return dbContext ?? (dbContext = DbFactory.Init()); }
}
public GenericRepository(IDbFactory dbFactory)
{
DbFactory = dbFactory;
}
public IQueryable<T> GetAll()
{
return DbContext.Set<T>();
}
答案 0 :(得分:2)
为什么需要构造函数GenericRepository以及它的作用是什么?
因为您需要将IDbFactory
的实现注入GenericRepository
以使其正常工作。此外,您正在寻找抽象如何使用工厂实例化 DbContext
,因此您不希望看到工厂本身如何实例化。
IMO,IDbFactory
的实际用法似乎很难避免某些行,它可以解决如下(事实上,它可以节省更多行!):
public class GenericRepository<T> : IGenericRepository<T> where T : class
{
public GenericRepository(IDbFactory dbFactory)
{
DbContext = new Lazy<DBCustomerEntities>(dbFactory.Init);
}
protected Lazy<DBCustomerEntities> DbContext { get; }
public IQueryable<T> GetAll() => DbContext.Value.Set<T>();
.......
如果只有在访问时需要初始化一次,则应使用Lazy<T>
。
另一件看起来不那么有希望的事情是你依靠IQueryable<T>
建立一个存储库。请参阅此其他问答:Repository design pattern以获取有关此主题的更多见解。