gpt4 book ai didi

asp.net - 在使用 MVP 模式构建的 ASP.NET Web 表单应用程序上应用依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-02 18:05:55 25 4
gpt4 key购买 nike

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

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 关键字实例化我的演示者,我想用解决依赖关系来替换它。在依赖关系解析期间,我想将当前 View 的实例传递给依赖关系解析器。我尝试对此进行了很多搜索,但没有得到任何满意的答案。

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

最佳答案

要解决这个问题,您可以使用属性注入(inject)。

首先,在 DI 容器中注册 ShipperOperationsNavigatorShipperPresenter

然后,在 View 的 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; }
}
...
}

View 将如下所示:

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

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

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

如果使用 Windsor,您唯一要做的就是将此接口(interface)注册为类型化工厂。对于其他 DI 容器,您必须实现一个在内部使用 DI 容器来解析演示者的类。

View 的 Page_Load 方法将使用如下工厂:

protected void Page_Load(object sender, EventArgs e)
{
var factory = YourIOC.Resolve<IShipperPresenterFactory>();
presenter = factory.Create(this);
}

关于asp.net - 在使用 MVP 模式构建的 ASP.NET Web 表单应用程序上应用依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10865695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com