2

私は 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 スタイルを適切に実装するにはどうすればよいですか?

4

4 に答える 4

1

asp.net mvc を使用してこれを書き直すのは簡単ではありませんか?

于 2008-12-10T16:15:05.320 に答える
0

読み込まれたすべてのデータを WebForms に保存するには ViewState を使用する必要があります。そのため、コントローラーはページが作成されたときにのみインスタンス化され、ユーザー セッションにオブジェクトを保存する必要がなくなります。

于 2010-02-04T18:23:21.757 に答える
0

POSTback の性質によって状態の変化が決まるため、それに対応する必要があります。使用するフレームワークはほとんど同じように機能し、リクエストごとに状態を再構築/バインドします。ユーザーのセッションに状態を保存する (データを読み取る) ことを確認する必要があります。

于 2009-07-12T16:24:46.463 に答える