2009-10-15 41 views
3

我参与了一个能够实时连接到不同硬件设备的项目。我们已经被分配制作一个触摸屏GUI,所以我们有一个MMI到设备。由于任何设备(以及任何类型的设备)都可能连接到我们的框架,因此我们决定让第三方设备开发人员制作他们自己的GUI插件。所有这一切都很好,现在到此为止:)WPF GUI插件设计。我需要一个小小的反馈

真正的问题是,我们的经理希望这些图形用户界面能够执行某些形式的控制流程,并且他不想让我们拥有自己的DSL--因此,我们在WPF中执行GUI,他们必须能够执行MSIL。这是一个巨大的安全威胁,我告诉他,但是因为它是一个原型,所以他说没问题。好吧,很好。
虽然有另一个问题 - 任意MSIL可能会崩溃或死锁,所以我们需要在某种异步上下文中托管它。由于WPF不允许多个线程访问图形用户界面,所以我们已经为自己设置了一个复杂的场景..

到目前为止,我对如何解决这个问题的想法相当缺乏见解。我最好的选择是将GUI部分和代码部分分成两部分:用于GUI的Raw Xaml以及用于代码的另一个线程中托管的MSIL。然后,我需要创建一个Facade(运行时?),通过向其他线程发送调用来将GUI和MSIL链接在一起。
我可以做到这一点,不是问题,但我认为它真的很臭。您迫使其他开发人员无需使用代码就可以使用MVVM,我不确定是否可以支持所有绑定,并且我不喜欢View和ViewModel在单独的线程中(嗯,我不介意,但我不确定它是否会导致问题,因为这个设计对于插件开发人员来说是非常透明的,所以他不会考虑让东东线程安全)。

有没有人有任何想法如何设计呢?还是对需求的想法?任何形式的反馈都会很好。

回答

0

我会尝试给你一个不同的答案。不幸的是我不认为你会有一个简单的时间。它确实很有趣:)

  • 通过使用您控制的某种应用程序启动代码将您的插件托管在单独的应用程序中。
  • 使用此机制建立安全你想要的方式(禁止访问文件系统,网络等)
  • 使用WCF与通信本地计算机的二进制模式。无论如何,你会提供某种API,所以这可能不会增加你所做的任何开销。
  • 将插件放在没有边框的窗口中,并手动将其放置在主应用程序窗口中。 (我曾经在一个项目中工作,我们在一些项目中使用了几个Office应用程序,它可以非常好地工作),您可能会花最多的时间来完成这项工作。但是一些小黑客会感觉自己像英雄一样! :)
  • 请在DLL级别的一些资源共享(UI剥皮,外观和感觉,共同控制和什么,而不是)
+0

谢谢你的意见。我和我的一位朋友进行了一些冗长的讨论,发现了这个问题和O/S在运行代码时遇到的问题之间的很多相似之处。除非我们比微软,Apple或整个* Nix社区更聪明,否则没有解决方案。甚至没有理由在异步环境中运行所有东西:)最好的办法是在插件加载到GUI之前验证,测试和签名插件。 那么,这是我们的结论:)我会接受这个答案,因为它提供了最好的反馈:) – cwap 2009-10-16 12:45:53

0

这里可能有一条中间道路 - 你的老板不希望你创建自己的DSL,但是像IronPython/IronRuby这样的现有动态语言怎么样?

不知道这是否会给你灵活性,你正在寻找,但它值得研究。我同意允许注入MSIL是hacky。我不确定将你的Views和ViewModel分离成单独的线程是否可以工作,干脆没有工作。

+0

已经提出,但显然这是一个不走的:S – cwap 2009-10-15 18:52:52

+0

..和是的,我不确定我是否可以在分离的情况下充分发挥作用。我觉得我在这里死了:( – cwap 2009-10-15 18:53:25

1

如果你想这样做'正确';看看在不同的应用程序域中托管插件。从托管应用程序设置这些应用程序域的安全级别并与定义明确的通道进行通信。

如果你想完成它;使用MEF。没有什么比插件架构的模式更胜一筹。

希望这会有所帮助,祝你好运!

+0

感谢您的输入:)已经使用MEF,这真棒!但真正的问题是,WPF不允许除拥有者调度程序之外的其他线程访问GUI,因此需要以某种方式桥接通信。 – cwap 2009-10-15 19:35:26

+0

这很糟糕。我感到你的痛苦 – 2009-10-15 19:36:55