【问题标题】:Where to put Application scope components in Winforms?在 Winforms 中将应用程序范围组件放在哪里?
【发布时间】:2026-01-09 21:35:01
【问题描述】:

您将应用程序范围的组件存储在您的 winforms 应用程序中的什么位置?我看到我可以在我的应用程序中创建 Component 的后代。然后,我可以拖放要在项目中的表单之间共享的组件。这是共享访问组件(非可视控件)的最佳实践吗?在 Delphi 中,我们有一个 DataModule。 DataModule 是一个简单的设计表面,用作非可视组件的容器。我会将数据访问对象拖放到这个表面上,并从所有表单中访问它们。它为我的数据对象提供了一个很好的中心位置和缓存。

你们在 Winforms 中是如何做到这一点的?

【问题讨论】:

  • 你的意思是组件的全局可访问的受控实例。如果是这样,您可能会对控制反转 IOC 感兴趣。 Microsoft 已经制作了一个 IOC 的示例实现,称为 Unity。
  • @REA_ANDREW,是的,我的意思是全局可访问的控件实例。我有一个额外的要求,即实例是具有设计表面的容器。我已经将 Unity 用于其他目的,但在这种情况下,我想将组件从 VS 工具箱拖放到实例上。

标签: c# winforms scope components


【解决方案1】:

System.ComponentModel.Component 提供design-surface for non-visual components in Visual Studio。通常,在您的项目中,您只需“添加”“组件”并开始添加和配置非可视组件,就像您可以与表单和用户控件的设计器一起使用。

对于全局访问(应用程序范围),您可以作为公共(或内部)静态成员提供对 Program 类中组件的访问。

您可以在 Main 方法中初始化该成员,或者通过 Program 与 MainForm 或其他组件之间的任意复杂交互,例如使用System.ComponentModel中相关类规定的服务基础设施和IContainer的自定义实现。

【讨论】:

  • 这就是我要找的。谢谢!
【解决方案2】:

我通常将单例用于日志类、数据库适配器等。当您希望在整个应用程序中对对象进行静态引用时,这很方便。

不过,我可能误解了你的问题。

【讨论】:

    【解决方案3】:

    有很多方法可以实现应用程序的“应用程序范围”对象和数据。但是,确定您需要访问的哪些共享“组件”实际上只是全局的,或者其中一些是否实际上是“上下文的”,这可能会很有用。全局组件和上下文组件之间存在差异,在某些情况下可能很微妙。

    对于作为全局工具最有用的实用程序(例如记录器),因为记录是那些令人讨厌的横切关注点之一。然而,在很多情况下,信息是特定上下文的,并且应该被包装在某种上下文对象中,只有在该上下文中实际执行的代码才能访问。有时很难识别上下文。如果您可以识别它,并且您可以弄清楚如何在正确的时间初始化上下文对象并将其提供给正确的代码,那么您最终应该会得到一个更好的产品,该产品的代码组织更合理,而不是仅仅制作一堆全球可访问的数据。

    我建议研究 BDD(行为驱动开发),这是一种将敏捷和 TDD 实践融合到更严格的开发方法中的方法,其中上下文起着关键作用。

    【讨论】:

      最近更新 更多