【发布时间】:2015-12-31 18:20:44
【问题描述】:
我使用 CastleWindsor 作为我的依赖注入框架,当您在 Controller 中时它一切正常,因为我们可以在 controllerfactory 中使用构造函数注入。
但是在某些特定情况下依赖注入(构造函数注入)不起作用。例如:我希望能够在某些实用程序类或扩展方法(例如 HtmlHelper )中使用 IOC 解决我的依赖关系我的意见。我知道有些人不会同意这一点,宁愿保持观点愚蠢,但让我们把它排除在讨论之外。
所以这基本上给我留下了一个选择,那就是使用...服务定位器。所以我知道大多数人认为服务定位器是一种反模式,我明白为什么..但是如果你不能使用依赖注入,你如何解决你与 IOC 的依赖关系?据我所知,使用 IOC 的服务定位器总比什么都没有好。我想避免使用服务定位器模式,但我似乎不明白在某些特定情况下如何避免它。
下一个问题是......所以即使你喜欢/不喜欢服务定位器。哪个是使用 CastleWindsor 实现此功能的最佳选择?
所以我猜选项是:
将容器公开为全局对象(或通过包装容器的其他全局对象),您可以从代码中的任何位置检索它。然后,您可以在容器上调用 resolve 和 release 方法。我不喜欢的一件事是,我们必须为短暂的生活方式对象显式调用 release。如果没有经验的开发人员不这样做,您最终会出现内存泄漏。
我还发现:https://www.nuget.org/packages/CommonServiceLocator.WindsorAdapter,它有很多下载..(与选项 1 相同的原理,但更通用并包装容器,因此您可以轻松交换 DI 框架)我查看了代码并我发现适配器只有解析对象的方法。所以我有点想知道为什么没有释放方法。这是否意味着这个包存在临时生活方式对象的内存泄漏问题?
希望有人可以就这些问题给我一些建议!
【问题讨论】:
-
是否可以将您的实用程序类(我假设它们是静态类或包含静态方法)和扩展方法转换为非静态类并让它们在构造函数中声明它们的依赖关系,以及然后让它们实现一些接口并将它们注入到使用它们的类(我认为是控制器)中?我这么说是因为通常任何需要依赖的东西都不应该是静态方法。
标签: asp.net-mvc dependency-injection castle-windsor castle service-locator