我已经继承了基于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