如何在通用数据访问层中将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);
}
}
使用依赖性倒置原则。在类的构造函数中注入一个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();
}
.Set
其固定但不能从其他层调用这个存储库 –
为什么不能?什么是错误? –
存储库使用每种方法的上下文是很常见的。每个存储库的上下文都是。通常情况下,存储库与来自全面工作单元的上下文一起工作。这取决于你如何注入上下文。你的问题太窄而无法回答。 –
我正在使用通用存储库,该存储库的任务是为不同的dbcontext的CRUD操作。我在解决方案中有differenet模块每个模块都有强悍的数据库上下文 –
只需在Get方法中添加一个'DbContext'参数即可。 –