首页 > 解决方案 > 实体框架的数据访问结构

问题描述

我目前有 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();
    }

    // (...)
}

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

谢谢你的建议。

标签: c#.netasp.net-mvcentity-framework

解决方案


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

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

您定义一个新属性来存储当前类需要的类的实例(依赖项),然后通过控制反转容器(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,并再次注意对象生命周期。


推荐阅读