【发布时间】:2025-11-25 01:50:01
【问题描述】:
我的基本设置很像这样; http://visualstudiomagazine.com/articles/2011/10/01/wpf-and-inversion-of-control.aspx
WPF 中的 MVVM 设置。我将 UnitOfWork 和 RepositoryFactory 注入到 ViewModel 中。这对于我迄今为止编写的对话框非常有效......但是我们的应用程序的大部分都在可停靠窗口内(想想 Visual Studio UI)。只要应用程序处于打开状态,它们就会一直打开。
所以我的想法是将工作单元从对话框的生命周期转移到方法调用的生命周期(例如 Button.Click())。
但我还没有找到一种不会破坏我从使用 Castle Windsor 作为 IoC 容器和/或不遵循 DRY 获得的一些好处的好方法。
这看起来很不错...http://www.codeproject.com/Articles/543810/Dependency-Injection-and-Unit-Of-Work-using-Castle 但我担心会话被包裹在一个半单例中,并担心我可能会因为删除对 UnitOfWork 的直接访问而自取其辱。
有人对此有好的解决方案吗?上面的代码项目好不好,如果不好,它的缺陷是什么?
【问题讨论】:
-
您好 Fenyx,我倾向于不使用显式使用工作,而是直接使用 ISession (NHibernate) 或 DbContext (EF)。即使它们具有应用程序生命周期,它们的生命周期也与视图模型绑定。只要这些视图没有从数据库中积累越来越多的数据,我就没有问题。请记住,DbContext/ISession 与数据库连接不同。
-
闲话少说,看看这个[问题][1]。 [1]:*.com/questions/3653009/…
-
@Sniffer 那是
[link caption](url);) -
如果您担心组件的生命周期,您可以改为注入一个负责创建组件实例的工厂。对工厂的引用将保存在视图模型中,并且在每次单击/事件/命令时,都可以创建、使用然后销毁组件的新实例。
-
您链接的代码项目文章似乎可以工作,但我认为这有点矫枉过正。我不喜欢将 UnitOfWork 应用于整个方法。它不是很灵活,看起来会很烦人。你说你正在注入一个 UnitOfWork 和一个 RepositoryFactory。与其拥有一个长期存在的 UnitOfWork,为什么不注入一个 UnitOfWork 工厂?看来您应该能够随意启动 UnitOfWork 并且它不应该与其父级的生命周期联系在一起。
标签: wpf mvvm castle-windsor ioc-container unit-of-work