(我知道其他MEF/MAF问题,但这是一个更具体的问题)
我想创建一个WPF应用程序,它基本上只是一个简单的外接程序主机,GUI和设置.所有实际工作都将由一个或多个插件完成.它们不需要在彼此之间进行通信,主应用程序将向用户发送用户输入/命令,并且它们将返回一些结果(例如,要呈现的WPF UI元素).
现在,由于应用程序的核心将基于插件,我需要选择一种管理它们的好方法.我希望能够在运行时加载/卸载/重新加载它们(例如,当找到并下载更新时).它们应该在自己的应用程序域和/或进程中运行以确保稳定性和安全性.
从一些研究和实验中我得出三个选择:
System.Addin(MAF):看来这可以做我需要的一切.有一个管道允许同时运行多个版本的API以实现兼容性等.但除非我遗漏了一些东西,否则我需要多次创建API - 主机和插件视图,合同和两个适用于合同的适配器.此外,与MEF相比,信息和资源也很少,而且大多数文章都是几年之久.我担心这会慢慢死去,宁愿不用它来做一个新项目.
MEF:这个看起来更简单,但也感觉有很多我无法控制的魔法,并且这些层没有像MAF那样分开.我只想要一个小型库,你可以链接到一个新项目,实现界面,插件就完成了.
手动加载:最后一个选项是手动扫描.dll文件夹,使用反射来查找插件类和创建实例.虽然它是可行的,但我宁愿使用一些框架而不是手动加载程序集,创建单独的进程/ appdomain等.
那么,哪一种最适合这种应用,还是有一些我错过的东西?
在Node.js中,我能够使用EventEmitter轻松地创建一个WordPress克隆,从而将一个钩子系统复制并构建到CMS核心中,然后插件可以连接到该核心.
我现在需要为我的CMS写入并移植到Go的相同级别的可扩展性和核心隔离.基本上我现在已经完成了核心,但是为了使它真正灵活,我必须能够插入事件(钩子)并使插件附加到这些具有附加功能的钩子.
我不关心重新编译(动态/静态链接),只要你不必修改核心来加载插件 - 永远不应该修改CMS核心.(如WP,Drupal等)
我注意到有一些相当未知的项目,试图在Go中实现与Node.js中的EventEmitter类似的事件:
https://github.com/CHH/eventemitter
https://github.com/chuckpreslar/emission
由于上面的这两个项目没有得到太多人气和关注,我觉得这种思考事件的方式现在可能是我们应该如何在Go中做到这一点?这是否意味着Go可能不适合这项任务?通过插件制作真正可扩展的应用程序?
似乎Go没有将事件构建到其核心中,并且RPC似乎不是将插件集成到核心应用程序中的有效解决方案,就像它们本地构建一样,并且好像它们是主应用程序本身的一部分.
无缝插件集成到您的核心应用程序中的最佳方式是什么,无需扩展点(在核心中),而无需在每次需要连接新插件时操作核心?
问题: Vim最喜欢的一个方面是它的灵活性.我最不喜欢的是VimL脚本语言本身.我知道每个人都有自己对语言和编辑的偏好,所以我认为不是每个人都同意我.
问题: 如果您是Vim用户,并且如果您对使用VimL扩展vim有类似的不满,那么您使用了哪些替代方法来扩展Vim同时避免使用默认语言?我正在寻找可能超出我已经尝试过的想法,包括但不限于:
免责声明:请注意,这不是对VimL脚本或任何人的偏好的猛烈抨击.如果它对您有用,那就太好了!我只是问那些已经找到需要替代品的人,以及满足这种需求的方法.
更新:此问题已更新,并请求特定工具的特定参考.不需要讨论,辩论,投票或扩展讨论.如果存在特定工具,请随时参考.
所以,我有一些我想尝试的东西.我的想法是拥有一个可视化设计器作为Visual Studio扩展,我希望能够拖出事件处理程序和连接行为,任何曾经玩过魔兽争霸III脚本编辑器的人都会非常清楚我是什么意思我想做什么.这种东西在visual studio可扩展性工具中是否容易处理?如果是这样,我应该从哪里开始学习如何做到这一点?
我正在开始研究我需要什么才能为Rails应用程序构建用户级插件系统(如Wordpress插件),所以我很欣赏一些通用指针/建议.用户级插件我指的是一个用户可以解压缩到一个文件夹并将其显示在管理界面上的包,允许他们添加一些额外的配置然后激活它.
这样做的最佳方法是什么?还有其他开源项目吗?Rails本身已经为可以利用的程序员级插件提供了什么?任何可以帮助我的Rails插件?
插件必须能够:
还有什么我想念的吗?
此外,有没有办法限制插件可以访问哪些表/操作有关迁移和模型,还限制他们访问路由(可能让它们包括但不删除路由)?
PS:我会尽量保持这个更新,编译我弄清楚的东西和相关答案,以便为其他人提供一种指导.
1992年到1993年的时间框架对于C++来说是至关重要的.
在'92/'93时间框架中,我研究了Aldus PageMaker的插件架构,该架构采用C++编码.PageMaker建立在一个名为VAMP的C++ OOP框架上,它支持Mac OS和Windows之间的可移植性.
所以我们尝试使用C++的特性来构建插件架构.由于所谓的脆弱基类问题,这证明对于C++类来说是非常有问题的.
我接着写了一篇发表在期刊上的论文,并在OOPSLA '93的反思研讨会上发表了论文.您可以阅读我在此处介绍的论文的pdf格式:
时间不变虚拟成员函数调度C++ Evolvable类 (页面底部,单击查看或下载)
我还在波特兰的Usenix会议上与Bjarne Stroustrup联系,并与他进行了几个月的对话,在那里他主张代表我处理脆弱的基类问题.(唉,当时其他问题被认为更重要 - 例如,试图通过批准来支持RTTI.)
微软此时为Windows平台引入了COM/DCOM系统,该系统被视为该问题的可行解决方案.通过用于定义COM接口的抽象类,C++可以用作COM的实现语言.
然而,这些天开发人员避开COM/DCOM - 尤其是基于COM的ActiveX.(1994年,我继续在微软工作,并在那里使用了C++和COM/DCOM十年.我得出结论,技术组合是一个明确的死胡同.我在这里提到的经验:建立有效的企业分布式软件系统)
与所有这些早期的C++历史相反,Steve Job的公司NeXT在90年代早期使用Objective C设计了一个插件架构,这是NeXT Step框架的组成部分.如今,苹果计算机和重要平台(如iPhone)上的Mac OS X中充满活力.
我提交的Objective C能够以出色的方式解决插件问题.
Java的拥护者将引用垃圾收集等因素来说明为什么它比C++更有效率.我不会对此提出异议,但是Objective C直到最近才用2.0进行垃圾收集.在iPhone上垃圾收集仍然无法使用.尽管如此,OS X插件架构完全可行 - 完全取决于Objective C风格的OOP与C++ OOP的优点.
有趣的是,Java已被用于构建适用于任何平台或软件开发社区的最普遍的插件架构.Eclipse IDE插件体系结构现在几乎已经成为传奇,就像这样的体系结构一样,几年前整合了Equinox OSGi模块管理层.J2EE应用服务器已经支持EJB 的插件架构十年了.目前,所有注意到的J2EE应用服务器都已合并OSGi来管理运行时可绑定模块.Spring Framework及其Spring Bean的运行时可绑定单元已经发展到超过J2EE - 主要是因为它的系统强大,可以管理Spring Bean中的绑定.
Java社区仍在努力定义官方模块管理标准,尽管事实如此,Java平台支持的软件架构比任何其他编程平台更普遍地包含插件功能.
尽管Java作为一种相对于C#的语言存在弱点,并且.NET已经在其.NET程序集标准中具有更强大的模块实现,但Java在广泛使用的日常软件系统方面仍然领先一步,其中包含某种形式的插件建筑.奇怪的是,Java社区甚至没有意识到这是他们作为企业开发平台持续成功的基础.
我个人认为C++的脆弱基类问题是最致命的缺陷.
自从这个问题突显给C++社区以及C++的创建者以来已经过去17年了,现在解决这个问题已经太晚了吗?
我正在尝试实现类似应用程序的插件.我知道已经有几个解决方案,但这只是证明这个概念,仅此而已.这个想法是默认情况下使应用程序主应用程序几乎没有功能,然后让插件相互了解,让它们实现所有需要的功能.
出现了几个问题:
有没有专门处理这些.NET设计的书?
谢谢
编辑:我认为人们正在偏离我提出的两个问题.我可以看看MEF和#develop,但我想得到具体的问题答案.
我从msdn完成了自定义模板项目教程第一部分,并在File - New - Project菜单中获得了一个基本的项目结构.然后我升级到msdn第二部分,无法通过" 测试Visual Studio模板 "部分.
当我在自定义项目模板文件夹添加.vstemplate文件中,将Build Action
所有的文件在我的自定义项目模板文件夹,ZipProject
并更改第二个和第6参数[ProvideProjectFactory]
来null
和".\\NullPath"
分别文件-新建-项目不显示对话框中的自定义模板了.
模板zip文件夹放在正确的文件夹中,我可以打开以前创建的自定义项目(如果没有安装项目模板,这将无法工作),但我无法创建任何新的自定义项目,因为它们不是'可见.
有没有人有创建自定义项目模板的经验?
我试图通过拦截对doClick(定位器)的调用来自定义Selenium的click命令的行为(通过user-extentions.js).基本上我需要在显示应用程序的"忙碌指示符"时延迟点击操作.
(现在这种情况的标准答案是在脚本中插入一个waitFor用于那些情况.实际上,我们目前在整个脚本中都有数以万计.我正试图消除这些.)
检测页面元素是微不足道的部分.棘手的部分是让脚本实际等待.我看起来很有希望,但失败的尝试看起来像这样:
var nativeClick = Selenium.prototype.doClick;
Selenium.prototype.doClick = function(locator) {
this.doWaitForCondition("!selenium.browserbot.findElementOrNull('busy-indicator')", 5000);
return nativeClick.call(this, locator);
}
Run Code Online (Sandbox Code Playgroud)
该doWaitForCondition被每一次点击之前调用,但它并不能在条件计算结果为false等待.nativeClick总是立即被调用,因此不会引入延迟.我怀疑doWaitForCondition函数实际上并没有执行任何等待,而是在命令执行循环中为它建立条件.在这种情况下,click命令已经在播放,我正在尝试在命令中运行命令.
有人可以了解Selenium命令执行和waitFor的工作原理,或提供有关如何执行此操作的建议吗?
extensibility ×10
plugins ×4
c# ×3
.net ×2
mef ×2
admin ×1
c++ ×1
codeplex ×1
eventemitter ×1
go ×1
internals ×1
java ×1
javascript ×1
objective-c ×1
prism ×1
scripting ×1
selenium-ide ×1
vim ×1
wpf ×1