我有一个通用数据访问层,由一个接口实现,将由具有不同数据库上下文的不同模块使用。
以下是代码:
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工厂。使用工厂创建和处理上下文,而不是直接访问上下文。
这是一个粗略的样本:
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();
}