Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 插件框架中的消息传递_C#_Plugins_Message Passing - Fatal编程技术网

C# 插件框架中的消息传递

C# 插件框架中的消息传递,c#,plugins,message-passing,C#,Plugins,Message Passing,首先,我的博客上有一些关于这个问题的背景资料: 我知道这些描述并不十分清楚,所以我将尽可能地总结我正在尝试的内容。该应用程序是一个个人理财程序。关于这个框架本身的更多背景可以在本文的末尾找到 框架可以处理许多不同类型的插件(例如,帐户、导出、报告等)。然而,我主要关注一类特殊的插件,即所谓的数据插件,因为正是这个类给我带来了问题。我有一类用于帐户的数据插件,一类用于事务等 我正在进行大规模的重新分解,这给我留下了以下数据插件体系结构: 数据插件对象(实现初始化、安装和插件元数据)[实现

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

我知道这些描述并不十分清楚,所以我将尽可能地总结我正在尝试的内容。该应用程序是一个个人理财程序。关于这个框架本身的更多背景可以在本文的末尾找到

框架可以处理许多不同类型的插件(例如,帐户、导出、报告等)。然而,我主要关注一类特殊的插件,即所谓的数据插件,因为正是这个类给我带来了问题。我有一类用于帐户的数据插件,一类用于事务等

我正在进行大规模的重新分解,这给我留下了以下数据插件体系结构:

  • 数据插件对象(实现初始化、安装和插件元数据)[实现
    IDataPlugin
    ]
  • 数据对象(例如帐户)[实现,例如,
    IAccount
    ]
  • 创建数据对象实例的工厂[实现,例如,
    IAccountFactory
    ]
以前,数据对象和插件对象被合并为一个,但这意味着必须为帐户中记录的每个事务实例化一个新的事务插件,这会导致许多问题。不幸的是,这种重新分解破坏了我的消息传递。数据对象实现了
INotifyPropertyChanged
,因此我遇到了一个新问题,我不知道如何解决这个问题:插件对象正在向MessageBroker注册事件,但实际触发事件的是数据对象。这意味着,订阅插件当前必须订阅每个创建的帐户、事务等这显然是不可扩展的

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

  • 使数据插件对象成为数据对象和MessageBroker的中间对象,可能会批处理更改通知。我不喜欢这样,因为它给消息传递系统增加了另一层复杂性,我觉得我应该可以不用它
  • 废弃当前基于事件的实现,并使用更易于管理的其他实现(内存中的WCF?!)
  • 所以我想我是在问:

  • 你将如何解决这个问题
  • 你认为我忽略了哪些潜在的解决方案
  • 我的方法是否有点正确/合理?!:-) 正如你可以从博客文章的日期中看出的,这个问题的一些变体已经让我很长一段时间了!因此,我们将非常感谢所有回复

    框架本身的背景如下:

    我的插件框架由三个主要组件组成:插件代理、首选项管理器和消息代理。插件代理完成基本的插件工作:发现和创建插件。偏好管理器管理框架和单个插件的用户偏好,例如启用哪些插件,哪些数据应该被保存,等等。通信是通过发布/订阅,消息代理位于中间,收集所有发布的消息类型和管理订阅。发布/订阅当前通过.NET
    INotifyPropertyChanged
    接口实现,该接口提供一个名为
    PropertyChanged
    的事件;MessageBroker构建一个实现
    INotifyPropertyChanged
    的所有插件的列表,并订阅此事件的其他插件。消息传递的目的是允许帐户和事务插件通知存储插件数据已更改,以便可以保存数据

    哇!大问题!:)

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

    这本身不是问题,您可以将事件控件放在中,但我建议您创建一个,并在该层中执行此事件通知。这样,只有一个对象负责发布通知


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

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

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

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

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

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