您的数据库将进入您的控制器的基类。这个基类应该扩展 Controller,你所有的控制器都应该扩展基类。这是一个小例子:
public class BaseController : Controller
{
private AuthServices _auth;
private LogHelper _log;
private Repository _repository;
/// <summary>
/// <see cref="AuthServices"/>
/// </summary>
protected AuthServices Authorization
{
get { return _auth ?? (_auth = new AuthServices()); }
}
/// <summary>
/// <see cref="LogHelper"/>
/// </summary>
protected LogHelper Log
{
get { return _log ?? (_log = new LogHelper()); }
}
/// <summary>
/// <see cref="Repository"/>
/// </summary>
protected Repository Repository
{
get { return _repository ?? (_repository = new Repository()); }
}
}
注意惰性实例化。这使我可以在运行测试之前潜入并使用模拟设置我的私有字段。
至于会话,您的用户对象仍然可以保存在会话中,就像在传统的 ASP.NET 应用程序中一样。几乎所有东西都还在(响应、缓存、会话等),但其中一些已经用 System.Web.Abstractions 中的类进行了包装,以便可以模拟它们进行测试。它们的行为方式仍然相同,尽管您不应该在它们的传统角色中使用它们中的一些(例如,不要使用 Response.Redirect,返回一个 ActionResult,例如执行重定向的 RedirectToRouteResult)。
至于你的问题背后的推理......
不要强调单个数据库连接。根据您的实施,这甚至可能不是一个好主意,因为请求可能会相互影响。只需打开您的连接,使用它,并在完成后处理/关闭它。
此外,MVC 带来的最大变化之一是拒绝了传统 ASP.NET 试图为 Web 开发带来的有状态模型。所有这些框架和视图状态都不再存在(不要注意幕后的人)。您持有的状态越少,您的 Web 应用程序就越不复杂且越健壮。试试看,你可能会喜欢。