[英]how to pass dbcontext as a parameter in generic data access layer
我有一個通過接口實現的通用數據訪問層,該接口將由具有不同數據庫上下文的不同模塊使用。
這是代碼:
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層中,我沒有數據庫上下文類。 我希望此GenericDataRepository接受DB上下文作為來自其他調用模塊的傳入參數,以執行在Geting方法中編寫的操作。
你看我用
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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.