我可以让我的上下文类只是我的控制器类中的字段吗?
当然。您可以在控制器中创建一个私有字段来保留您的数据库上下文类的实例。
您不需要将其设为单例。到达 AdminController 和 HomeController 的请求是 2 个不同的 HTTP 请求,它应该为每个 http 请求创建和使用 DbContext 类的新对象。
public class AdminController
{
private YourDbContext db;
public AdminController()
{
db = new YourDbContext();
}
public ActionResult Users()
{
var list=db.Users.ToList();
//use list as needed now
}
}
使用这种方法,唯一的问题是,即使您请求的操作方法不使用任何数据,您也会创建 YourDbContext 的对象。
如果需要,您可以创建一个 YourBaseController 并在那里创建 DbContext 对象初始化,您的两个控制器都可以从那里继承。
public class MyBaseController : Controller
{
protected YourDbContext db;
public MyBaseController ()
{
db = new YourDbContext();
}
}
public class AdminController : MyBaseController
{
}
由于您没有从内存中释放 DbContext 对象,因此我们将依赖 dot net 垃圾收集器。
但是,如果您愿意,您可以创建 DbContext 类的对象,使用它并在使用后通过 using 关键字处理它
public ActionResult View()
{
var name= new List<string>();
using(var db=new YourDbContext())
{
name=db.Users.Select(s=>s.Name);
}
//to do : return something
}
使用 using 表达式,框架将在 YourDbContext 实例退出 using { } 的范围后处理它
另外,查看dependency injection 可能是个好主意,这样您就不会使用new 关键字手动创建对象,但框架会为您注入这些对象。这将帮助您使您的代码对单元测试更加友好。