首先,我的博客上有一些关于这个问题的背景资料:
- http://www.codebork.com/coding/2008/06/25/message-passing-a-plug-framework.html
- http://www.codebork.com/coding/2008/07/31/message-passing-2.html
我知道描述不是很清楚,所以我会在这里尽可能地总结我正在尝试的内容。该应用程序是一个个人理财程序。本文末尾提供了有关框架本身的更多背景信息。
框架可以处理许多不同类型的插件(例如,帐户、导出、报告等)。但是,我专注于一类特定的插件,即所谓的数据插件,因为正是这类给我带来了问题。我有一类用于帐户的数据插件,一类用于交易等。
我正在进行大规模的重构,这给我留下了以下数据插件架构:
- 数据插件对象(实现初始化、安装和插件元数据)[实现
IDataPlugin<FactoryType>
] - 数据对象(例如帐户)[实现,例如
IAccount
] - 创建数据对象实例的工厂[实现,例如
IAccountFactory
]
以前数据对象和插件对象合二为一,但这意味着账户中记录的每笔交易都必须实例化一个新的交易插件,这导致了许多问题。不幸的是,这种重构破坏了我的消息传递。数据对象实现INotifyPropertyChanged
了,所以我遇到了一个新问题,我不确定如何解决:插件对象正在向消息代理注册事件,但实际上是数据对象触发了事件。这意味着订阅插件当前必须订阅每个创建的帐户,交易等! 这显然是不可扩展的。
据我目前所知,我有两种可能的解决方案:
- 使数据插件对象成为数据对象和消息代理的中间人,可能批量更改通知。我不喜欢这样,因为它给消息传递系统增加了另一层复杂性,我觉得我应该可以不用。
- 垃圾当前基于事件的实现并使用其他更易于管理的东西(内存中 WCF?!)。
所以我想我真的在问:
- 你将如何解决这个问题?
- 您认为我忽略了哪些潜在的解决方案?
- 我的方法甚至模糊地走上正轨/明智吗?!:-)
正如您从博客文章的日期中可以看出的那样,这个问题的某些变体已经让我感到很长一段时间了!因此,我们将不胜感激任何和所有的回应。
框架本身的背景如下:
我的插件框架由三个主要组件组成:插件代理、首选项管理器和消息代理。插件代理负责插件的基本工作:发现和创建插件。首选项管理器管理框架和各个插件的用户首选项,例如启用了哪些插件,数据应该保存在哪里等。通过发布/订阅进行通信,消息代理位于中间,收集所有发布的消息类型和管理订阅。发布/订阅当前是通过 .NET
INotifyPropertyChanged
接口实现的,该接口提供了一个名为PropertyChanged
; 消息代理建立一个所有插件实现的列表INotifyPropertyChanged
并订阅其他插件此事件。消息传递的目的是让账户和交易插件通知存储插件数据发生了变化,以便保存。