【问题标题】:Data access structure with Entity Framework实体框架的数据访问结构
【发布时间】:2019-07-31 15:44:38
【问题描述】:

我目前有 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# .net asp.net-mvc entity-framework


    【解决方案1】:

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

    关于如何处理依赖关系而不使一切都成为静态的主要问题:

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

    是在构造函数中初始化实例还是让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,并再次注意对象生命周期。

    【讨论】:

    • 感谢您的详细回答@rhytonix,它有很大帮助。你能告诉我更多关于对象生命周期的信息吗?你有一个如何管理的例子吗?
    • 另一个问题,如果我要在某些视图中使用 DataAccess,我应该做些什么具体的事情,或者我可以创建一个 DataAccess 实例并使用它吗?再次感谢。
    • 对象的生命周期主要有3种(由于依赖注入了,注入器应该确定注入对象的生命周期): 1. 瞬态的,每次向容器请求对象的实例时,它返回一个新实例。 2、Singleton,容器对对象的所有请求都返回同一个实例——同一个实例一直被复用——。 3. 每个请求:在同一个 Web 请求中返回相同的实例,新的 Web 请求接收新的实例。生命周期的命名可能因一个 IoC 而异,但它们具有相同的基本思想。
    • 例如DbContext 不是线程安全的,因此不应将其定义为静态(或单例),而是将其定义为每个请求的依赖项。您可以考虑使用 IoC 容器为您处理依赖项。容器具有注册依赖项的简单格式,它们的预期生命周期,然后它们在运行时神奇地为您解析所有构造函数依赖项。格式类似于:Register.WithLifeTime(lifeTime)。 Autofac 是一种具有良好文档的优秀 IoC。您可能希望先构建一个小型应用程序,然后再重构您当前的应用程序。
    • 您可以从视图中获取 DataAccess 的实例,但这不是使用 IoC 容器的推荐方法(这称为服务定位器反模式),您应该依赖 IoC解决类的构造函数中的依赖关系。此外,视图应该从控制器接收预构建的模型,而不是自己发出数据库请求。
    猜你喜欢
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多