实体框架的数据访问结构

时间:2019-07-31 15:44:38

标签: c# .net asp.net-mvc entity-framework

我目前有4种用于访问数据层的静态类:每种类型的操作(选择,插入,更新,删除)都使用一种。

public static class DataAccess_SELECT
{
    private static MyDBContext db = new MyDBContext();

    public static List<T_News> GetAllNews()
    {
        return db.T_News.AsNoTracking().ToList();
    }

    public static List<T_News> GetAllNewsActif()
    {
        return db.T_News.AsNoTracking().Where(x => !x.DateDesactivation.HasValue || (DateTime.Now > x.DateActivation && DateTime.Now < x.DateDesactivation)).ToList();
    }

    public static List<T_Sondage> GetAllSondages()
    {
        return db.T_Sondage.AsNoTracking().ToList();
    }

    // (...)
}

我已经读到应该避免在这种情况下使用静态类,否则我应该如何组织它呢?

感谢您的建议。

1 个答案:

答案 0 :(得分:1)

首先,不应将数据库上下文的实例定义为静态,因此您也需要注意这一点。

关于您如何在不使所有内容保持静态的情况下处理依赖项的主要问题:

您定义了一个新属性,该属性存储当前类需要的类的实例(依赖项),然后通过控制反转容器(IoC容器)或直接在构造函数中初始化该实例。

是在in构造函数中初始化实例还是让IoC容器处理所有事情是另一回事,但是您需要注意所创建对象的生命周期,哪些应该短暂存在,哪些应该短暂存在。可以重复使用。

//pattern #1
public class DataAccess {
    private readonly DatabaseContext _databaseContext;
    public DataAccess() {
        //initialized in the constructor
        _databaseContext = new DatabaseContext();
    }
}

//pattern #2
public class DataAccess {
    private readonly DatabaseContext _databaseContext;
    public DataAccess(DatabaseContext databaseContext) {
        //The IoC container supplies the instace
        _databaseContext = databaseContext;
    }
}

使用DataAccess类的类在整个调用链中也将始终使用相同的模式。

您可以阅读有关依赖项注入的知识,同时使用模式1,并再次注意对象的生存期。