【问题标题】:Message passing in a plug-in framework插件框架中的消息传递
【发布时间】:2008-09-08 22:13:27
【问题描述】:

首先,我的博客上有一些关于这个问题的背景资料:

我知道描述不是很清楚,所以我会在这里尽可能地总结我正在尝试的内容。该应用程序是一个个人理财程序。本文末尾提供了有关框架本身的更多背景信息。

框架可以处理许多不同类型的插件(例如,帐户、导出、报告等)。但是,我专注于一类特定的插件,即所谓的数据插件,因为正是这类给我带来了问题。我有一类用于账户的数据插件,一类用于交易等。

我正在进行大规模的重构,这给我留下了以下数据插件架构:

  • 数据插件对象(实现初始化、安装和插件元数据)[实现IDataPlugin<FactoryType>]
  • 数据对象(例如帐户)[实现,例如IAccount]
  • 创建数据对象实例的工厂 [实现,例如,IAccountFactory]

以前数据对象和插件对象是合二为一的,但这意味着必须为账户中记录的每笔交易都实例化一个新的交易插件,这会导致很多问题。不幸的是,这种重构破坏了我的消息传递。数据对象实现了INotifyPropertyChanged,所以我遇到了一个新问题,我不确定如何解决:插件对象正在向消息代理注册事件,但它是数据对象实际上触发事件。这意味着订阅插件当前必须订阅每个创建的帐户、交易等!这显然是不可扩展的。

据我所知,目前我有两种可能的解决方案:

  1. 使数据插件对象成为数据对象和消息代理的中间人,可能会批量更改通知。我不喜欢这样,因为它给消息传递系统增加了另一层复杂性,我觉得我应该可以不用。
  2. 丢弃当前基于事件的实现并使用其他更易于管理的东西(内存中 WCF?!)。

所以我想我真的在问:

  1. 您将如何解决这个问题?
  2. 您认为我忽略了哪些潜在的解决方案?
  3. 我的方法甚至模糊地在轨道上/明智吗?! :-)

正如您从博文发布的日期可以看出的那样,这个问题的某些变体已经困扰我很长时间了!因此,我们将不胜感激任何和所有的回应。

框架本身的背景如下:

我的插件框架由三个主要组件组成:插件代理、首选项管理器和消息代理。插件代理负责插件的基本工作:发现和创建插件。首选项管理器管理框架和各个插件的用户首选项,例如启用了哪些插件,数据应该保存在哪里等。通过发布/订阅进行通信,消息代理位于中间,收集所有发布的消息类型和管理订阅。发布/订阅目前是通过.NET INotifyPropertyChanged 接口实现的,它提供了一个名为PropertyChanged 的事件;消息代理构建所有实现INotifyPropertyChanged 的插件列表,并订阅其他插件此事件。消息传递的目的是让账户和交易插件通知存储插件数据发生了变化,以便保存。

【问题讨论】:

    标签: c# plugins message-passing


    【解决方案1】:

    哇!大问题! :)

    如果我错了,请纠正我。您现在的基本解决方案是一种观察者模式,其中数据对象(帐户等)通知其状态的变化。您认为问题在于订阅插件必须在每个对象中注册才能处理通知。

    这本身没问题,你可以把事件控制放在Domain Model,但我建议你创建一个Service Layer,并在这一层做这个事件通知。这样一来,只有一个对象负责发布通知。

    Martin Fowler 在他的博客中有一系列事件模式。 Check it out!很好的阅读。

    【讨论】:

      【解决方案2】:

      这是我对您的问题的理解:您有一个插件对象,它可能必须侦听 x 个数据对象上的事件——尽管您不想订阅每个数据对象上的事件。我假设几个插件可能想要监听同一个数据对象上的事件。

      您可以创建会话类型对象。每个插件都会监听会话对象上的事件。数据对象不再引发事件 - 它调用会话对象来引发事件(其中一个参数必须是引发事件的数据对象)。

      这意味着您的插件只需订阅一个事件,但它们会从所有数据对象中获取事件。

      另一方面,如果一次只有一个插件会监听一个数据对象,为什么不让数据对象直接调用插件呢?

      【讨论】:

        【解决方案3】:

        现在还早,但您是否考虑过尝试使用 MEF 而不是自己滚动?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-10-05
          • 1970-01-01
          • 2021-10-31
          • 2021-07-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多