【发布时间】:2010-11-06 23:56:24
【问题描述】:
创建可设计的 .NET 组件时,您需要提供默认构造函数。来自IComponent 文档:
要成为组件,类必须 实现 IComponent 接口和 提供一个基本的构造函数 不需要参数或单个 IContainer 类型的参数。
这使得通过构造函数参数进行依赖注入成为不可能。 (可以提供额外的构造函数,但设计者会忽略它们。)我们正在考虑的一些替代方案:
-
服务定位器
不要使用依赖注入,而是使用服务定位器模式来获取依赖。这似乎是 IComponent.Site.GetService 的用途。我想我们可以创建一个可重用的 ISite 实现(ConfigurableServiceLocator?),它可以配置必要的依赖项。但这在设计师环境中如何运作?
-
通过属性进行依赖注入
通过属性注入依赖。 提供默认实例(如果是) 有必要在一个组件中显示 设计师。记录哪些属性 需要注射。
-
使用 Initialize 方法注入依赖项
这很像通过属性注入,但它将需要注入的依赖项列表保存在一个地方。这样,所需依赖项的列表就会被隐式记录下来,当列表发生变化时,编译器会帮助您解决错误。
知道这里的最佳做法是什么吗?你是怎么做到的?
编辑:我已经删除了“(例如 WinForms UserControl)”,因为我打算将问题与一般组件有关。组件都是关于控制反转的(参见UMLv2 specification 的第 8.3.1 节),所以我不认为“你不应该注入任何服务”是一个好的答案。
edit 2:花了一些时间使用 WPF 和 MVVM 模式,最终“得到”了 Mark 的答案。我现在看到视觉控制确实是一个特例。至于在设计器表面上使用非可视组件,我认为 .NET 组件模型从根本上与依赖注入不兼容。它似乎是围绕服务定位器模式设计的。也许这将随着 .NET 4.0 中 System.ComponentModel.Composition 命名空间中添加的基础设施而开始改变。
【问题讨论】:
标签: .net dependency-injection components service-locator