我已經繼承了基於webforms構建的ASP.NET應用程序,並且該應用程序因將其所有業務邏輯嵌入代碼隱藏而受到影響。因此,此應用程序不能進行單元測試。我想將每種形式的功能分解爲MVC風格,但是我發現ASP.NET拒絕我的每一個努力來重構它。在一般情況下,我喜歡我的單獨MVC類如下:使用ASP.NET webforms的MVC
public class LoginModel
{
public string Username, Password;
public bool IsAuthenticated;
}
public interface ILoginView
{
event Action UserLoggedIn;
void SetMode(bool isAuthenticated);
}
public class LoginController
{
ILoginView View;
LoginModel Model;
public LoginController(ILoginView view, LoginModel model)
{
this.View = view;
this.Model = model;
// hook onto view events
}
}
一旦我有我的課設置和很好的單元測試,我可以實現我的用戶控件或頁面ILoginView
接口:
public class LoginView : UserControl, ILoginView
{
public LoginView() : base()
{
new LoginController(this); // registers view with the controller
}
}
如果這是一個winform應用程序,它將美化工作。但是,ASP.NET生命週期會導致這種風格崩潰。
ASP.NET創建並破壞每個頁面加載的視圖。由於我的控制器是由視圖保存的,所以模型由控制器保存,每次回發都會導致我的頁面失去其狀態。
我可以通過在用戶會話中持有我的控制器來解決上述問題,但這會帶來一系列問題。特別是,在會話中放置控制器會導致內存問題,因爲在會話過期之前,模型和控制器不會被垃圾回收回收。從頁面到頁面的導航可創建數十個控制器,但是當用戶離開頁面時,控制器不會自行處理。
由於視圖在每次回發時被銷燬/重新創建,因此我必須在每次回發時重新註冊與控制器的視圖。這比聽起來更難,因爲模型的狀態需要在每次回發時被複制回View,但同時我們不想覆蓋用戶對上次回發中所做的View的更改。當處理使用此MVC風格的動態創建或AJAX控件時,您不知道會變成什麼樣的額外噩夢。
我知道我這得太多,有一個更簡單的方式來獲得我想要的結果,但我怎麼正確地實現了MVC的風格使用的WebForms?
如果你必須堅持使用DNN,那麼我認爲你最好的選擇就是堅持使用Web表單實現,並且只是將代碼背後的業務邏輯清理乾淨。MVC做的很好,但是試圖混合模型很困難,正如你發現的那樣。 Web表單並不差,它只是不同於MVC。擁抱webforms的好感。 – 2010-02-04 18:27:59