1

我花了一天时间阅读有关如何在进程之间最好地共享数据的文章/博客。我以前没有机会深入探讨这个话题,但我想知道您认为处理以下问题的最佳解决方案是什么。

我正在开发一个使用 MEF 绑定插件的应用程序。插件(主要是显示为 MDI 表单的表单)可以根据它们需要/提供的内容具有多个接口实现,大型机检查它们是否已实现,然后满足它们的需求。到目前为止,一切都很好,正在运行。

现在,如果您启动应用程序,它会要求有效登录(MainFrame),如果登录成功,则用户将存储在 MainFrame 中。现在知道所有可用插件的 PluginManager 在激活时将用户传递到插件中。

这行得通,但这是一个好方法吗?

我还考虑过有一个 AppEnvironment 类,它使用静态变量共享多个信息,如 User、DataConn-Strings 等。该应用程序经常使用任务,因此我使用静态锁定对象保护了可能在运行时更改的静态变量。

我已经在这里读到静态变量不好......真的是这样吗?

我发现的另一件事是,我可以使用管道在 MainFrame 及其子窗体之间共享信息……这不是有点过分了吗?你喜欢/使用管道来满足这些要求吗?

请不要误会我的意思,我不是在寻找一种简单的方法来归档我想要的东西,但我真的很喜欢用一种精致、优雅的方式在 MainFrame 及其 ChildForms 中共享信息。如果我能学到新东西,那就更好了;)

感谢您的关注,任何帮助都将不胜感激:)

干杯凯尔

4

1 回答 1

0

问题:这行得通,但这是一个好方法吗?

答:对于简单的场景,它可能就足够了。

在可扩展实现的情况下,关于数据共享要记住的一件事是“注意并防止插件上下文对大型机上下文数据进行未知或不需要的更改”

问题:我已经在这里读到静态变量不好......真的是这样吗?

答:不,在我看来它们还不错,很微妙,在处理多线程应用程序时应该小心处理。

锁定变量将在一定程度上有所帮助,在少数情况下,我建议您查看Interlocked类以获取更多预防措施。

问题:我想到的另一件事是我可以使用管道在 MainFrame 和它的子窗体之间共享信息……这不是有点过分了吗?你喜欢/使用管道来满足这些要求吗?

答:管道是进程之间通信的最快方式之一。

案例研究:使用基于管道的 WCF 服务在两个每秒处理大量数据请求的 Windows 服务之间获取数据。这是两个服务使用 WCF 在同一台机器上交谈的最可行的选择。

我会同意你的意见,并说使用管道有点过分。此外,所有想要在您的应用程序中加载的插件在技术上都必须实现这一点,并将为这些插件添加更多可避免的代码来维护。

总结: 您可以遵循的最好的活生生的示例模式是 Visual Studio SDK。我建议使用某种普遍认可的命令或消息传递模式。双方都需要知道消息/命令实体以及对处理这些命令/消息的命令处理程序或信使的引用。用于大型机和插件代码之间交互的受控通道将是一种前进且仍然可扩展的方式。

于 2014-07-22T23:01:25.073 回答