【问题标题】:Windsor Ioc avoid call resolve all the timeWindsor Ioc 一直避免调用 resolve
【发布时间】:2013-12-19 18:30:00
【问题描述】:

伙计们,我需要你们的帮助我在我的 C# Winforms 应用程序中使用 Castle Project Windsor IoC 容器。我的服务类通过构造函数传入实现存储库具有 DI。我使用 Windsor 将它们全部注册为 Component.Register(...etc 但每次我使用我的服务类时,我都会调用 resolve。例如:
var employeeService = container.Resolve....etc
有没有其他方法不必一直调用resolve? 在 ASP.NET 中,您只需将它们全部注册,然后设置控制器工厂:
ControllerBuilder.Current.SetControllerFactory(new WindsorIoCFactory());
有了这个我可以直接使用我的控制器(使用服务)而不调用resolve。你如何在 winforms 中做到这一点?

【问题讨论】:

  • 我认为answer 应该可以帮助你

标签: c# dependency-injection inversion-of-control castle-windsor


【解决方案1】:

您应该使用Composition Root 方法。

简而言之,您应该只在 App-StartUp 使用 Resolve 一次,基本上解决 MainView 并且通过它您应该能够获取所有视图(很可能通过 TypedFactory)及其依赖项,而无需显式 Resolve 调用。

根据评论链接,服务定位器方法是一种可弃用的反模式,特别是当可以使用组合根时。

在 windsor wiki 上,您会找到一个基于 Silverlight app 的示例,非常接近 Winform 场景。

【讨论】:

  • 感谢克里斯蒂亚诺!将检查合成根
  • 嗨克里斯蒂亚诺..如果我有很多服务,比如员工、客户..等,并将它们全部注册到作为组合根的 winforms 的启动或主要方法中,我在那里没有问题,但是我应该把我的容器实例放在哪里?它必须是像 main 这样的地方,或者它必须是静态的,我可以在全局范围内调用它来解决问题,对吗?哦,还有诸如 Resolve 工厂之类的东西吗?所以我不必在我调用 resolve 的每个 .cs 文件中引用(使用 [namespace])?
  • 阅读这个mookid.dk/oncode/archives/1854 你应该得到你所有的答案......加上上面来自wiki的silverlight示例。但是,是的,您的容器应该作为私有变量存在于“Main”/StartUp 类中,外部的任何人都不应直接或通过 ServiceLocator 又名“邪恶”(cit. Krzysztof Koźmic)访问它 :-)
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 2011-08-17
  • 2021-09-08
  • 1970-01-01
  • 2011-08-12
  • 2013-02-13
相关资源
最近更新 更多