c# - 实体框架的数据访问结构
问题描述
我目前有 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 容器处理一切是另一回事,但是您需要注意创建对象的生命周期,哪些应该是短暂的,哪些可以重用.
//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,并再次注意对象生命周期。
推荐阅读
- javascript - 使用 Google 登录时是否可以刷新页面 - 登录时?
- python - python函数的使用
- php - Laravel index.php 路由问题
- c# - WebSecurity 将 CurrentUserId 显示为 -1
- django - django formset - 如果复选框不正确,不要提交单个表单?
- mysql - Liferay-7 与 MySQL-8 数据库不工作
- android - 警报对话框文本颜色更改问题
- javascript - 让 HTML 文件选择器浏览服务器端
- cloud-foundry - 在 Cloud Foundry 中暂存
- php - php输入后方法中的javascript值不起作用