我最近读过Phil Haack's post他在其中给出了为 ASP.NET 实现模型 View 演示器的示例。其中一个代码片段显示了 View 类的代码是如何实现的。
public partial class _Default : System.Web.UI.Page, IPostEditView
{
PostEditController controller;
public _Default()
{
this.controller = new PostEditController(this, new BlogDataService());
}
}
但是,这里 View 构造了 BlogDataService 的实例并将其传递给演示者。理想情况下, View 不应了解 BlogDataService 或演示者的任何较低层依赖项。但我也更喜欢将 BlogDataService 作为演示者的构造函数注入(inject)依赖项,因为它使演示者的依赖项变得明确。
stackoverflow 上也有人提出了同样的问题 here 。
其中一个答案建议使用服务定位器来获取 BlogDataService 的实例并将其传递给演示者的构造函数。但是,此解决方案并不能解决 View 了解 BlogDataService 并需要显式获取引用的问题到它。
是否有一种方法可以使用 IoC 或 DI 容器工具自动构造演示者对象,以便 View 不必显式创建 BlogDataService 对象并将 View 和服务实例注入(inject)演示者的构造函数。我更喜欢尽可能使用构造函数注入(inject)模式。
或者有更好的设计可以解决这个问题吗?如果我正在构建 WinForms 应用程序而不是 ASP.NET WebForms 应用程序,是否有更好的方法来实现此目的?
感谢您的任何反馈。
最佳答案
是的,有。例如,在 Web 表单构造函数中使用 StructureMap:
public partial class AttributeDetails : EntityDetailView<AttributeDetailPresenter>, IAttributeDetailView
{
public AttributeDetails()
{
_presenter = ObjectFactory.With<IAttributeDetailView>(this).GetInstance<AttributeDetailPresenter>();
}
....
}
正如您在这里看到的,演示者需要注入(inject) View 和服务
public AttributeDetailPresenter(IAttributeDetailView view, IAttributeService attributeService)
{
MyForm = view;
AppService = attributeService;
}
您还可以对 Web 表单使用 StructureMap BuildUp 功能,这样就可以避免直接在 View 中使用 ObjectFactory。
关于asp.net - 在 ASP.NET MVP 应用程序中的 Presenter 中注入(inject)较低层依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2149651/