你的數據庫將在你的控制器的基類中。這個基類應該擴展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,而是返回執行重定向的RedirectToRouteResult之類的ActionResult),但它們仍然具有相同的行爲方式。
至於你的問題背後的原因....
做單數據庫連接不上的壓力。根據您的實施情況,這可能是一個糟糕的主意,因爲請求可能會彼此接連。只要打開你的connex,使用它,並完成後處理/關閉它。另外,MVC帶來的最大變化之一是拒絕了傳統的ASP.NET試圖爲Web開發帶來的有狀態模型。所有框架和視圖狀態都不存在了(不要理會幕後的那個人)。您對Web應用程序的複雜性和可靠性要求越低。試試吧,你可能會喜歡它。
「請注意懶惰的實例化,這使我可以在運行測試之前偷偷摸摸地設置我的私有字段並進行模擬。」爲什麼不使用IoC? – 2009-05-27 15:46:46
寶寶的步驟......你應該用一個這樣的例子來回答。 – Will 2009-05-27 16:50:19