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

时间:2017-03-15 19:27:26

标签: c# entity-framework linq generics 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);
       }
 }

1 个答案:

答案 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();
}
相关问题