私は Web フォーム上に構築された ASP.NET アプリケーションを継承しましたが、そのアプリケーションはすべてのビジネス ロジックがコード ビハインドに埋め込まれていることに悩まされています。その結果、このアプリケーションは単体テストできません。
すべてのフォームの機能を MVC スタイルに分割したいと考えていますが、ASP.NET は、それをリファクタリングしようとする私のあらゆる努力に抵抗することがわかりました。一般に、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 は、ページが読み込まれるたびにビューを作成および破棄します。私のコントローラーはビューによって保持されているため、モデルはコントローラーによって保持されているため、ポストバックごとにページの状態が失われます。
上記の問題は、ユーザー セッションで Controller を保持することで解決できますが、それによってさまざまな問題が発生します。特に、コントローラーをセッションに配置すると、セッションの有効期限が切れるまでモデルとコントローラーがガベージ コレクションによって回収されないため、メモリの問題が発生します。ページからページに移動すると、多数のコントローラーが作成されますが、ユーザーがページから移動してもコントローラーは破棄されません。
ビューはポストバックごとに破棄/再作成されるため、ポストバックごとにビューをコントローラーに再登録する必要があります。ポストバックごとにモデルの状態をビューにコピーする必要があるため、これを行うのは思ったよりも困難ですが、同時に、以前のポストバックで行われたビューへのユーザーの変更を上書きしたくありません。この MVC スタイルを使用して動的に作成されたコントロールや AJAX 処理されたコントロールを処理する場合、これがどのような追加の悪夢になるかはわかりません。
私はこれを考えすぎており、必要な結果を得る簡単な方法があることを知っていますが、Web フォームを使用して MVC スタイルを適切に実装するにはどうすればよいですか?