为了解决这个问题,你可以使用属性注入。
首先,注册托运人操作, 航海家 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);
}