如何在通用数据访问层中将dbcontext作为参数传递

问题描述:

我有一个通用接口实现的数据访问层,接口将由具有不同数据库上下文的不同模块使用。如何在通用数据访问层中将dbcontext作为参数传递

下面是代码:

public class GenericDataRepository<T> : IGenericDataRepository<T> where T : class 
{ 



    public virtual IList<T> Get(Func<T, bool> filter, int page, int pageSize, string[] includePaths = null, params SortExpression<T>[] sortExpressions) 
    { 
     List<T> list; 
     using (var context = new _DbContext()) 
     { 
      IQueryable<T> dbQuery = context.Set<T>(); 
      if (includePaths != null) 
      { 
       for (var i = 0; i < includePaths.Count(); i++) 
       { 
        dbQuery = dbQuery.Include(includePaths[i]); 
       } 
      } 
      if (filter != null) 
      { 
       dbQuery = dbQuery.Where(filter).AsQueryable(); 
      } 
      IOrderedEnumerable<T> orderedQuery = null; 
      for (var i = 0; i < sortExpressions.Count(); i++) 
      { 
       if (i == 0) 
       { 
        if (sortExpressions[i].SortDirection == ListSortDirection.Ascending) 
        { 
         orderedQuery = dbQuery.OrderBy(sortExpressions[i].SortBy); 
        } 
        else 
        { 
         orderedQuery = dbQuery.OrderByDescending(sortExpressions[i].SortBy); 
        } 
       } 
       else 
       { 
        if (sortExpressions[i].SortDirection == ListSortDirection.Ascending) 
        { 
         orderedQuery = orderedQuery.ThenBy(sortExpressions[i].SortBy); 
        } 
        else 
        { 
         orderedQuery = orderedQuery.ThenByDescending(sortExpressions[i].SortBy); 
        } 
       } 
       dbQuery = orderedQuery.AsQueryable(); 
      } 
      dbQuery = dbQuery.Skip(((int)page - 1) * (int)pageSize); 
      dbQuery = dbQuery.Take((int)pageSize); 

      list = dbQuery 
      .ToList<T>(); 

     } 
     return list; 

    } 
} 

在这种GenericDataRepository层,我没有DB上下文类。我希望这个GenericDataRepository接受DB上下文作为来自不同调用模块的传入参数,以执行在Getting方法中编写的操作。

你可以看到我用
using (var context = new _DbContext())
在获取方法。我不知道如何编写GenericDataRepository来实现这个目标。

这是我的接口

public interface IGenericDataRepository<T> where T : class 
{ 


    IList<T> Get(Func<T, bool> filter, int page, int pageSize, string[] includePaths = null, params SortExpression<T>[] sortExpressions); 
     } 
} 
+0

存储库使用每种方法的上下文是很常见的。每个存储库的上下文都是。通常情况下,存储库与来自全面工作单元的上下文一起工作。这取决于你如何注入上下文。你的问题太窄而无法回答。 –

+0

我正在使用通用存储库,该存储库的任务是为不同的dbcontext的CRUD操作。我在解决方案中有differenet模块每个模块都有强悍的数据库上下文 –

+0

只需在Get方法中添加一个'DbContext'参数即可。 –

使用依赖性倒置原则。在类的构造函数中注入一个DbContext工厂。使用工厂创建和处理上下文,而不是直接访问上下文。

这里是一个粗略的样品:

public class GenericDataRepository<T> : IGenericDataRepository<T> where T : class 
{ 
    private readonly Func<DbContext> _contextFactory; 
    public GenericDataRepository(Func<DbContext> contextFactory) 
    { 
     _contextFactory = contextFactory; 
    } 

    public virtual IList<T> Get(Func<T, bool> filter, int page, int pageSize, string[] includePaths = null, params SortExpression<T>[] sortExpressions) 
    { 
     List<T> list; 
     using (var context = contextFactory()) 
     { 
      //... 
     } 
    } 
} 

假定其中使用通用数据存储库中的层访问的DbContext,他们现在可以实例化以下面的方式存储库:

var repository = new GenericDataRepository<SomeType>(DbContextfactory); 
public void DbcontextFactory() 
{ 
    return new _DbContext(); 
} 
+0

.Set 说:contextFactory不包含设置方法 –

+0

其固定但不能从其他层调用这个存储库 –

+0

为什么不能?什么是错误? –