asp.net - 在 ASP.NET MVP 应用程序中的 Presenter 中注入(inject)较低层依赖项

标签 asp.net dependency-injection inversion-of-control mvp

我最近读过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/

相关文章:

c# - 从 M 集合中取出 n 个唯一对象

php - 常量是否与全局变量和单例一样邪恶?

asp.net-mvc - Nopcommerce 新表服务注册错误

java - 将参数传递给 Spring MethodInvokingFactoryBean 参数列表

c# - JavaScript 日历问题

asp.net - 从通用处理程序 (.ashx) 进行异步调用

asp.net - Visual Studio 中的慢 "Find All References"

c# - 无论如何,是否可以在 azure 函数中使用 AddSecretClient DI 扩展?

dependency-injection - OSGi/Felix 声明式服务 : How to filter the services to be bound?

java - 在没有循环引用的情况下使用 Spring IOC 连接 MVP?