【发布时间】:2012-02-15 08:57:45
【问题描述】:
我正在将依赖注入框架引入现有的 WebForms 应用程序(使用 Castle Windsor)。
我在 DI 方面有相当丰富的经验,并且倾向于非常喜欢构造函数注入而不是 setter 注入。如果您熟悉 Webforms,您就会知道 ASP.Net 框架处理页面和控件对象的构造,因此无法实现真正的构造函数注入。
我目前的解决方案是在 Global.asax 的 Application_Start 事件中注册容器,并将容器作为公共静态变量保存在 Global 中。然后,我只需在页面中直接解决我需要的每个服务,或者在需要它们时进行控制。所以在每一页的顶部,我都会得到这样的代码:
private readonly IMyService _exposureManager = Global.IoC.Resolve<IMyService>();
private readonly IMyOtherService _tenCustomersExposureManager = Global.IoC.Resolve<IMyOtherService>();
显然,我不喜欢所有这些对容器的引用分散在我的应用程序中,或者我的页面/控件依赖项是非显式的,但我一直无法找到更好的方法。
有没有更优雅的解决方案将 DI 与 Webforms 结合使用?
【问题讨论】:
-
我找到了这篇文章codemag.com/Article/1210031,其中有关于如何在 WPF、MVC 和 WebForms 上实现依赖注入的优秀示例代码(在 WebForms 的情况下使用
PageHandlerFactory)。似乎说由于代码隐藏类的限制,您将不得不使用 setter 注入。有趣的是,它还展示了 Microsoft Managed Extensibility Framework (MEF) 如何帮助您以非常有用且略微不标准的方式解决此问题和类似的 DI 问题。 -
从 .NET 4.7.2 开始,WebForms 中有一个依赖注入。请参阅下面的答案。
标签: c# asp.net dependency-injection webforms castle-windsor