我参与了一个能够动态连接到不同硬件设备的项目。我们已被分配制作触摸屏GUI,因此我们为设备提供了MMI。
由于任何设备(以及任何类型的设备)都可能连接到我们的框架,我们决定让第三方设备开发人员制作自己的GUI插件。到目前为止一切都很好,花花公子:)
真正的问题是,我们的经理希望这些GUI能够执行某些形式的控制流程,并且他不希望我们拥有自己的DSL - 因此,当我们在WPF中执行GUI时,他们必须能够执行MSIL。这是一个巨大的安全威胁,我告诉他,但由于它是原型,他说没关系。好的,很好。
还有另一个问题 - 任意MSIL可能崩溃或死锁,所以我们需要在某种异步上下文中托管它。由于WPF不允许多个线程访问GUI,我们自己就是一个复杂的场景..
到目前为止,我对如何解决这个问题的想法很缺乏。我最好的办法是将GUI部分和代码部分分成两部分:GUI的Raw Xaml和代码的另一个线程中托管的MSIL。然后我需要创建一个Facade(在运行时?),通过向每个其他线程发送调用来将GUI和MSIL链接在一起。
我能做到这一点,不是问题,但我认为这真的很臭。你迫使其他开发人员在没有代码的情况下使用MVVM,我不确定我是否可以支持所有绑定,而且我不喜欢View和ViewModel处于单独的线程中(好吧,我不介意,但我不确定它是否会引起问题,因为这个设计对插件开发者来说非常透明,所以他不会考虑让线程安全。)
有没有人对如何设计这个有任何想法?还是对要求的想法?任何形式的反馈都会很好。
答案 0 :(得分:1)
如果你想做'对';看看在不同的应用程序域中托管插件。从托管应用程序设置这些应用程序域的安全级别,并与明确定义的渠道进行通信。
如果你想完成它;使用MEF。没有什么比插件架构的模式好了。
希望这有帮助并祝你好运!
答案 1 :(得分:0)
这里可能有一条中间路 - 你的老板不希望你创建自己的DSL,但是现有的动态语言如IronPython / IronRuby怎么样?
不确定这是否会为您提供所需的灵活性,但值得研究。我同意允许注入MSIL是hacky。我不确定将你的Views和ViewModels分成单独的线程是否会起作用,更不用说干净利落的工作了。
答案 2 :(得分:0)
我会尝试给你一个不同的答案。不幸的是,我不认为你会有一个轻松的时间。虽然听起来很有意思:))