2008-09-08 55 views
2

首先,有我的博客上提供一点背景的这个问题:消息传递的插件框架

我知道,描述不是非常清楚,所以我会尽力总结我在这里尽力而为的尝试。该应用程序是一个个人财务计划。关于框架本身的进一步背景可以在这篇文章的末尾找到。

框架可以处理多种不同类型的插件(例如帐户,导出,报告等)。但是,我关注的是一个特定的插件类,即所谓的数据插件,因为这是导致我遇到问题的类。我有一类数据插件的账户,一个用于交易等

我中途已经给我留下了下面的架构数据插件广阔的再保:

  • 数据插件对象(实现intialisation,安装和插入式元数据)[器具IDataPlugin<FactoryType>]
  • 的数据对象(例如,账户)[器具,例如,IAccount]
  • 甲工厂创建实例的数据对象[实现,例如,IAccountFactory]

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

至于我当时可以告诉我有两个可能的解决方案:

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

所以我想我真的问:

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

从博客文章的日期可以看出,这个问题的一些变体现在已经征税了相当长的一段时间!因此,任何和所有的答复将不胜感激。

的背景框架本身如下:

我的插件框架由三个主要部分组成:一个插件经纪人,一个偏好管理器和消息代理。插件代理执行面包和黄油插件:发现和创建插件。偏好管理器管理框架和各个插件的用户偏好,例如启用了哪些插件,数据应该保存在哪里等。通信是通过发布/订阅,消息代理坐在中间,收集所有发布的消息类型和管理订阅。发布/订阅目前通过.NET INotifyPropertyChanged界面实现,该界面提供了一个名为PropertyChanged的事件;消息代理构建了一个实现INotifyPropertyChanged的所有插件的列表,并订阅其他插件此事件。消息传递的目的是允许帐户和事务插件通知存储插件数据已更改,以便可以保存它。

回答

3

这是我对您的问题的理解:您有一个插件对象可能需要侦听x数据对象上的事件 - 但您不希望订阅每个数据对象上的事件。我假设几个插件可能想要侦听同一个数据对象上的事件。

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

这意味着您的插件只需订阅一个事件,但它们会从所有数据对象中获取事件。另一方面,如果一次只有一个插件会监听数据对象,为什么不直接让数据对象直接调用插件呢?

4

哇!大问题! :)

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

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

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

1

它还早,但你有没有考虑尝试使用MEF而不是滚动自己?