Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有实体框架的数据访问结构_C#_.net_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# 具有实体框架的数据访问结构

C# 具有实体框架的数据访问结构,c#,.net,asp.net-mvc,entity-framework,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(); }

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

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


感谢您的建议。

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

关于您的主要问题,即如何处理依赖关系而不使所有内容都是静态的:

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

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

//模式1 公共类数据访问{ 专用只读DatabaseContextu DatabaseContext; 公共数据访问{ //在构造函数中初始化 _databaseContext=新的databaseContext; } } //模式2 公共类数据访问{ 专用只读DatabaseContextu DatabaseContext; 公共DataAccessDatabaseContext databaseContext{ //IoC容器提供Instance _databaseContext=databaseContext; } } 而使用DataAccess类的类也将使用相同的模式,一直在调用链中


您可以阅读有关依赖项注入的内容,同时使用模式1,并再次关注对象的生命周期。

感谢@rhytonix提供的详细答案,这非常有帮助。你能告诉我更多关于物体的寿命吗?还有一个问题,如果我要在一些视图中使用DataAccess,我应该做些什么,或者我可以创建一个DataAccess实例并使用它吗?再次感谢。自从注入依赖项以来,有三个主要的对象生存期,注入器应该确定注入对象的生存期:1。瞬态,每次容器被请求一个对象的实例时,它都会返回一个新实例。2.在Singleton中,容器为对象的所有请求返回相同的实例-相同的实例一直被重用。3.每个请求:在相同的web请求中返回相同的实例,新的web请求接收新的实例。国际奥委会对寿命的命名可能各不相同,但它们有着相同的基本理念。DbContext不是线程安全的,因此不应该将其定义为静态或单例,而是将其定义为每请求依赖项。您可以考虑使用IoC容器为您处理依赖关系。容器有一个简单的格式来注册依赖项、它们的预期生存期,然后在运行时神奇地为您解析所有构造函数依赖项。格式类似于:Register.WithLifeTimeLiTime。Autofac是一个具有良好文档的优秀IoC。在重构当前应用程序之前,您可能希望先构建一个小型应用程序。您可以从视图中获取DataAccess实例,但这不是使用IoC容器的推荐方法,这称为服务定位器反模式,相反,您应该依靠IoC来解决类的构造函数中的依赖关系。此外,视图应该从控制器接收预构建的模型,而不是自己发出数据库请求。