3

我正在使用 MVP 模式创建一个 ASP.NET Web 表单应用程序。我的视图结构是这样的:

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
        }
        ...
}

我的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;
        }
        ...
}

我不想使用 new 关键字来实例化我的演示者,我想用解析依赖项来替换它。在依赖解析期间,我想将当前视图的实例传递给依赖解析器。我尝试对此进行了很多搜索,但没有得到任何满意的答案。

是否可以使用任何 IoC 容器(如 StructureMap、Ninject、Unity 或 MEF)来解决此问题?任何指针都会有很大帮助。

4

1 回答 1

3

要解决此问题,您可以使用属性注入。

首先,在 DI 容器中注册ShipperOperationsNavigatorShipperPresenter 。

然后,在您的视图的 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 回答