簡體   English   中英

如何在通用數據訪問層中將dbcontext作為參數傳遞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM