Dependency injection 具有多个窗口的WPF应用程序中的依赖项注入

Dependency injection 具有多个窗口的WPF应用程序中的依赖项注入,dependency-injection,Dependency Injection,在业务线应用程序中使用依赖项注入时,有许多工厂是正确的吗?所谓业务线应用程序,我指的是像SalesForce.com这样的应用程序或具有许多功能和相关窗口/表单的CRM系统。事实上,SalesForce.com可能是一个坏例子。HTTPGET/POST机制创建了明显的组合根,在该根处调用DI容器。但是长时间运行的WPF应用程序呢?为所有可能的函数创建对象图似乎是浪费,因为其中许多函数在会话期间不会被调用,或者如果此人的角色限制了他们对应用程序的使用,那么可能永远不会被调用 解决方案似乎是使用DI

在业务线应用程序中使用依赖项注入时,有许多工厂是正确的吗?所谓业务线应用程序,我指的是像SalesForce.com这样的应用程序或具有许多功能和相关窗口/表单的CRM系统。事实上,SalesForce.com可能是一个坏例子。HTTPGET/POST机制创建了明显的组合根,在该根处调用DI容器。但是长时间运行的WPF应用程序呢?为所有可能的函数创建对象图似乎是浪费,因为其中许多函数在会话期间不会被调用,或者如果此人的角色限制了他们对应用程序的使用,那么可能永远不会被调用

解决方案似乎是使用DI容器根据需要解析每个窗口/表单。但是:

这违反了仅在合成根解析的DI原则,在本例中,是在应用程序启动时解析父窗口。 这将需要一个工厂来创建窗口/表单,以防止引用 应用程序代码中的DI容器。工厂似乎会迅速增加。 这似乎增加了而不是降低了复杂性,因为需要创建工厂,其唯一功能是创建一个人工合成根,以隐藏对DI Resolve方法的调用

我也理解理想情况下工厂不应该引用DI容器,但在这种情况下,需要解析一个对象图,不使用DI容器将要求我自己解析依赖关系,这显然违背了使用DI容器的目的

老实说,现在应用程序并没有那么复杂,工厂也不会让事情变得太复杂。然而,我编写了这个独立的应用程序,使用DI作为学习练习,向我自己和我所在的小型开发团队介绍它。团队中的大多数人都不熟悉DI,当需要额外的代码和类来隐藏DI容器的引入时,他们会对DI的有效性感到惊讶

FWIW,我确实在.NET中找到了MarkSeemann的依赖注入的副本,但是WPF示例似乎太简单,无法涵盖这个确切的场景,正如在介绍性文本中所预期的那样。他的示例在OnStartup事件中创建了一个MVVM表单


任何见解都值得赞赏。谢谢。

在WPF和Silverlight中创建视图/视图模型时,我经常遇到这种情况。事实上,我最近在Mark Seemann的博客上发表了一篇评论,大意如下:

。这篇文章本身也很有趣,讨论了Mark认为引用容器是可以接受的地方

如果您将Castle Windsor用于DI,则可以使用TypedFactoryFacility,它允许您避免引用工厂中的容器


当不使用Windsor时,我的一般方法是创建一个通用的抽象工厂,调用Resolve并使用它完成。对我来说,这仍然感觉像是服务位置,也就是说,这感觉是错误的,但我还没有找到另一个编码和维护起来不费力的非温莎解决方案。

在WPF和Silverlight中创建视图/视图模型时,我一直遇到这个问题。事实上,我最近在Mark Seemann的博客上发表了一篇评论,大意如下:

。这篇文章本身也很有趣,讨论了Mark认为引用容器是可以接受的地方

如果您将Castle Windsor用于DI,则可以使用TypedFactoryFacility,它允许您避免引用工厂中的容器

当不使用Windsor时,我的一般方法是创建一个通用的抽象工厂,调用Resolve并使用它完成。对我来说,这仍然感觉像是服务位置,也就是说,它感觉不对,但我还没有找到另一个编码和维护起来并不痛苦的非温莎解决方案