C# 插件框架中的消息传递
首先,我的博客上有一些关于这个问题的背景资料:C# 插件框架中的消息传递,c#,plugins,message-passing,C#,Plugins,Message Passing,首先,我的博客上有一些关于这个问题的背景资料: 我知道这些描述并不十分清楚,所以我将尽可能地总结我正在尝试的内容。该应用程序是一个个人理财程序。关于这个框架本身的更多背景可以在本文的末尾找到 框架可以处理许多不同类型的插件(例如,帐户、导出、报告等)。然而,我主要关注一类特殊的插件,即所谓的数据插件,因为正是这个类给我带来了问题。我有一类用于帐户的数据插件,一类用于事务等 我正在进行大规模的重新分解,这给我留下了以下数据插件体系结构: 数据插件对象(实现初始化、安装和插件元数据)[实现
- 数据插件对象(实现初始化、安装和插件元数据)[实现
]IDataPlugin
- 数据对象(例如帐户)[实现,例如,
]IAccount
- 创建数据对象实例的工厂[实现,例如,
]IAccountFactory
INotifyPropertyChanged
,因此我遇到了一个新问题,我不知道如何解决这个问题:插件对象正在向MessageBroker注册事件,但实际触发事件的是数据对象。这意味着,订阅插件当前必须订阅每个创建的帐户、事务等这显然是不可扩展的
据我目前所知,我有两种可能的解决方案:
INotifyPropertyChanged
接口实现,该接口提供一个名为PropertyChanged
的事件;MessageBroker构建一个实现INotifyPropertyChanged
的所有插件的列表,并订阅此事件的其他插件。消息传递的目的是允许帐户和事务插件通知存储插件数据已更改,以便可以保存数据
哇!大问题!:)
如果我错了,请纠正我。您现在的基本解决方案是一种观察者模式,其中数据对象(帐户等)通知其状态的更改。您认为问题在于订阅插件必须在每个对象中注册才能处理通知
这本身不是问题,您可以将事件控件放在中,但我建议您创建一个,并在该层中执行此事件通知。这样,只有一个对象负责发布通知
Martin Fowler在他的博客中有一系列事件模式!非常好的阅读。现在还早,但是您是否考虑过尝试使用而不是自己滚动?这是我对您的问题的理解:您有一个插件对象,可能需要侦听x数据对象上的事件-但您不想订阅每个数据对象上的事件。我假设几个插件可能想要监听同一数据对象上的事件 您可以创建会话类型对象。每个插件都侦听会话对象上的事件。数据对象不再引发事件-它调用会话对象来引发事件(其中一个参数必须是引发事件的数据对象) 这意味着您的插件只需订阅一个事件,但它们从所有数据对象获取事件 另一方面,如果一次只有一个插件会监听数据对象,为什么不让数据对象直接调用插件呢