3

MVPパターンを使用してASP.NETWebフォームアプリケーションを作成しています。私の見解の構造は次のようなものです。

public partial class ShipperView : System.Web.UI.Page, IShipperView
{
       ShipperPresenter presenter;
       public ShipperOperationsView()
        {
            IShipperOperations operations = new ShipperOperations();
            INavigator navigator = new Navigator();
            presenter = new ShipperPresenter(this,operations,navigator);  //Instantiating presenter
        }
        ...
}

私のプレゼンターの基本的な構造は次のようなものです。

public class ShipperPresenter
{
        IShipper shipperView;
        IShipperOperations operations;
        INavigator navigator;
        public ShipperPresenter(IShipperView view,IShipperOperations operations,INavigator navigator)
        {
            shipperView = view;
            this.operations = operations;
            this.navigator = navigator;
        }
        ...
}

新しいキーワードを使用してプレゼンターをインスタンス化したくないので、依存関係を解決するように置き換えたいと思います。依存関係の解決中に、現在のビューのインスタンスを依存関係の解決に渡したいと思います。これをいろいろ調べてみましたが、満足のいく答えは得られませんでした。

この問題は、StructureMap、Ninject、Unity、MEFなどのIoCコンテナーのいずれかを使用して解決できますか?どんなポインタでも大いに役立ちます。

4

1 に答える 1

3

この問題を解決するには、プロパティインジェクションを使用できます。

まず、ShipperOperationsNavigatorShipperPresenterをDIコンテナに登録します。

次に、ビューのPage_Loadメソッドで、選択したDIコンテナーのresolveメソッドを呼び出します。

public class ShipperPresenter
{
        IShipper shipperView;
        IShipperOperations operations;
        INavigator navigator;
        public ShipperPresenter(IShipperOperations operations,INavigator navigator)
        {
            this.operations = operations;
            this.navigator = navigator;
        }

        public IShipper ShipperView
        {
            get { return shipperView; }
            set { shipperView = value; }
        }
        ...
}

そして、ビューは次のようになります。

public partial class ShipperView : System.Web.UI.Page, IShipperView
{
       ShipperPresenter presenter;

       protected void Page_Load(object sender, EventArgs e)
       {
           presenter = YourIOC.Resolve<ShipperPresenter>();
           presenter.ShipperView = this;
       }
       ...
}

ファクトリを使用して、選択したパラメータを渡しながら、実行時にプレゼンターを作成することもできます。実際、DIの世界では、これは、実行時にのみ認識される依存関係を持つオブジェクトをインスタンス化する場合に進む方法です。Castle Windsorには、このための優れたメカニズムがあります。これは、型付きファクトリと呼ばれます。

ファクトリを使用すると、プレゼンタークラスを変更する必要はありません。代わりに、ファクトリのインターフェイスを作成します。

public interface IShipperPresenterFactory
{
    ShipperPresenter Create(IShipper shipperView);
}

Windsorを使用している場合は、このインターフェイスを型付きファクトリとして登録するだけです。他のDIコンテナーでは、プレゼンターを解決するためにDIコンテナーを内部的に使用するクラスを実装する必要があります。

ビューのPage_Loadメソッドは、次のようにファクトリを使用します。

protected void Page_Load(object sender, EventArgs e)
{
    var factory = YourIOC.Resolve<IShipperPresenterFactory>();
    presenter = factory.Create(this);
}
于 2012-06-02T22:28:39.673 に答える