首先,我要说的是,我将谈论System.ComponentModel.Component
。
你知道,我理解,.NET组件模型
通过站点服务提供了定义单独的组件
的能力,因此它们可以以松散耦合的方式彼此通信,并且每个组件
都很容易被替换。
但我的观点是,我可以通过正确的面向对象编程
方式实现这一点:
我的意思是,通过使用抽象类
、接口
等手段,我可以实现所有提到的功能/互操作性。
那么为什么和何时应该依赖于组件模型呢?
首先,我要说的是,我将谈论System.ComponentModel.Component
。
你知道,我理解,.NET组件模型
通过站点服务提供了定义单独的组件
的能力,因此它们可以以松散耦合的方式彼此通信,并且每个组件
都很容易被替换。
但我的观点是,我可以通过正确的面向对象编程
方式实现这一点:
我的意思是,通过使用抽象类
、接口
等手段,我可以实现所有提到的功能/互操作性。
那么为什么和何时应该依赖于组件模型呢?
你可以使用自己的基类、接口等方式来实现。事实上,System.ComponentModel中的内容就是这样的一组公共接口和基类,使您能够实现组件并与其他人的实现一起使用。
如果您只是自己编写基类和接口,那么任何想要接口化您的代码的人都必须使用您的类。而如果他们想要同时集成两个不同供应商的组件呢?
特别是WinForms中的所有内容都使用System.ComponentModel的东西来实现可以放在表单上的控件。他们必须选择一个接口来表示它,那为什么不选择System.ComponentModel中定义的接口呢?既然已经有了一个完美设计的接口,他们为什么还要自己构建一个呢?
它允许您为诸如Visual Studio之类的应用程序提供设计时功能。
"System.ComponentModel
命名空间包含实现组件和控件的运行时和设计时行为的类型。" 您提供的功能可以是任何内容(BackgroundWorker
与ComboBox
的功能非常不同,但它们都是一个Component
)。
ComponentModel
提供元数据,而回报是您可以设计可在可视化设计器中使用的组件。因此:
public interface IDesigner : IDisposable {
IComponent Component {get;}
DesignerVerbCollection Verbs {get;}
void DoDefaultAction();
void Initialize(IComponent component);
}
命名空间还提供了TypeDescriptor / Convertor等内容,可用于设计时访问属性。
(有人建议您可以将System.ComponentModel视为一种IoC容器。我从未见过有人这样做;正如您所说,对于它并没有比良好的设计更多的优势)。
因此:考虑在您还想为组件提供IDesigner时使用System.ComponentModel.Component。