在使用 MVP 模式构建的 ASP.NET Web 表单应用程序上应用依赖注入

2024-01-04

我正在使用 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
        }
        ...
}

我的演示者的基本结构是这样的:

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)解决此问题吗?任何指针都会有很大帮助。


为了解决这个问题,你可以使用属性注入。

首先,注册托运人操作, 航海家 and 托运人主持人在 DI 容器中。

然后,在视图的 Page_Load 方法中,调用您选择的 DI 容器的解析方法。

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 世界中,当您想要实例化具有仅在运行时已知的依赖项的对象时,这是继续进行的方法。温莎城堡有一个很好的机制,叫做.

使用工厂,无需修改presenter类。相反,为工厂创建一个接口:

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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在使用 MVP 模式构建的 ASP.NET Web 表单应用程序上应用依赖注入 的相关文章

随机推荐