c# - 带有 CaSTLe Windsor 的 Winforms MVP - 子窗体的 DI?

标签 c# winforms inversion-of-control castle-windsor mvp

我正在使用被动 View MVP 和 CaSTLe Windsor 作为 IoC 容器构建一个 winforms 应用程序。我对依赖注入(inject)和 MVP 还是有点陌生​​,所以我正在寻找一些清晰度......

我有一个主窗体,其中包含许多用户控件,并且还会根据需要调出其他对话框(例如登录、选项等)。我的第一个问题是......我应该使用构造函数注入(inject)来将这些其他 View 的呈现器获取到主视图中,还是应该返回到服务定位器类型的模式? (有人告诉我这是一个大诺诺!)还是别的什么?

第二个问题...用户控件在“完成”时需要与主窗体进行通信(该状态的定义因控件而异)。有没有标准的方法来连接它们?我在想也许只是在主要主持人和 child 主持人之间连接事件,但我不确定这是否是正确的想法。

我很感激任何帮助,似乎 MVP 和 IoC 在 winforms 中的组合没有得到很好的记录。

最佳答案

首先让我说我有一段时间没有编写 WinForms,所以我可能不完全准确。

如果您使用的是被动 View ,您的 View 应该没有依赖关系,因此您不需要向它们注入(inject)任何东西。 Presenter 应该由容器实例化,并通过 .ctor 将 IView 注入(inject)其中。通常避免使用服务定位器 - this post描述了一些强大的替代方案。

为了返回通信,我会使用某种桥接接口(interface),它会被注入(inject)到演示器中。我在这里含糊其词,因为细节取决于您的场景的具体情况,以及您决定如何精确划分逻辑。

通常不要太关注 IoC 容器——它只是一个可以为你完成一些(大部分)工作的工具,但它不是魔杖——你应该能够在没有容器的情况下做同样的事情因此,如果它分散了您的注意力,请在制作原型(prototype)时随意将其从图片中移除。

关于c# - 带有 CaSTLe Windsor 的 Winforms MVP - 子窗体的 DI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2642245/

相关文章:

php - 了解 IoC、DI 和引用方法

c# - 如何从 C#/Mono 调用 linux 程序?

c# - 如何判断一个点在立方体内部还是外部?

c# - 如何在 Entity FrameWork 中存储特定的 float

C#- TreeView : inserting node at certain position

c# - 在 Winform 中托管 RemoteAPP session

c# - Autofac 列出所有子依赖链注册

c# - 可以将内部 List<T> 作为 IEnumerable<T> 或 ICollection<T> 返回吗?

c# - 如何在显示后立即安全关闭表单?

ninject - Simpleinjctor 根据泛型类型获取实例