10

现在我正在编写一个应用程序,并且我认为必须有一个更好的解决方案来解决我现在正在做的事情。

我有一个主窗口来处理程序的设置。然后我有更多的课程和窗户。例如,一个语言处理程序类和一个处理“主要功能”所需的用户输入的表单。

然而,直到现在我总是必须将我的主窗口传递给这些类中的每一个,因为语言处理程序应该能够更改主窗口的字符串。并且其他窗体也应该能够将数据传递到主窗口。

如果我们想象会有更多的类并且每个类都需要一个主窗口的副本,这将消耗大量资源,具体取决于主窗口的“大小”。

那么,是否有更好/更有效的方式在这些类之间进行通信。

4

4 回答 4

13

常见的方法是使用观察者模式,在 .NET 中是事件系统。简单地说,您的类订阅彼此的事件并在引发事件时执行操作。正如评论中所指出的,传递引用并不占用大量内存,但它会导致不同代码片段之间的紧密耦合——观察者模式解决了这个问题。

于 2012-08-31T08:04:01.017 回答
3

另一种选择是将您的类视为服务。将它们编码为一个接口,然后使用依赖注入(又名控制反转)来构建对象图(您告诉 IoC 容器您想要一个frmSomething,它会确定它需要哪些服务/类并根据需要实例化它们)。

这意味着:

  • 您只需要针对接口而不是实现进行编码
  • 您的代码是松散耦合的(您可以将 a 交换OldTranslator为 a NewTranslator,只要它们都符合相同的接口,除了容器的配置外,无需更改任何内容)
  • 您可以开发依赖尚未编写的服务的高级功能,并且您的代码将编译
  • 如果需要,您可以在运行时通过更改在容器中注册的类/服务来非常轻松地更改应用程序的工作方式。

查看Unity for MS-Supported DI 容器。温莎城堡是一个受欢迎的选择,但还有更多

值得注意的是,如您所说,传递主窗口的“副本”并不是一件坏事-实际上您只是将引用(实际上是指针)传递给主窗口(因为任何比真实的更复杂原语是引用类型)。这意味着几乎没有任何开销

于 2012-08-31T08:07:51.153 回答
2

我建议您使用GalasoftPrism MVVM 实现。在那里你可以使用他们非常容易使用的消息服务。需要信息的类只向订阅者发送一条消息,然后他们可以发送所有需要的数据。我认为这是处理沟通的最简单方法。

于 2012-08-31T08:01:21.150 回答
2

除了 IVAN 给出的 ans .. 如果我们在没有所有这些术语的情况下查看更高级别的视图,那么您可能应该创建一个静态类,该类将作为 InMemoryStorage 服务并在其上定义字段以保存
您将完全控制的信息在共享的内容和多个组件可以更改它
此外,您可以定义 getter 和 setter,并在属性更改时引发事件,以便不同的表单或窗口(视图)可以订阅更改并相应地采取行动

于 2012-08-31T08:04:50.223 回答