GenericRepository构造函数有什么作用?

时间:2018-05-03 10:21:24

标签: c# visual-studio entity-framework dependency-injection autofac

根据我的理解GenericRepository继承自IGenericRepository。它的属性为IDbFactory DbFactoryDBCustomerEntities dbContextDBCustomerEntities 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>();  
    }   

1 个答案:

答案 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以获取有关此主题的更多见解。