我正在开发一种全新的产品,最终将根据客户的个性化需求在其周围建立不同的功能。因此,我想实现具有可以部署的插件的能力,核心应用程序将检测插件并相应地进行更改。问题在于该产品很可能会针对不支持System.Addin的早期版本的.Net或MEF的可能性。
那就是说,哪些模式/编程方法很适合支持C#中的插件?我想完全远离第三方框架,尽管可以自由地命名。理想情况下,我希望能够插入插件,修改主菜单和/或上下文菜单和/或提供新服务。在Java中,这可以通过扩展点很好地处理。我基本上不想写自己的扩展点管理器吗?
答案 0 :(得分:2)
您希望查看System.Reflection命名空间以帮助您完成此任务。一种方法是为您的插件类(lookup strategy pattern)创建一个通用接口,然后在运行时使用反射来查看给定文件夹中的所有dll(可能是exe所在的位置或特殊的加载项文件夹)记下包含该特定接口的类。具体来说,保留一个类型的字典(具有您的特殊接口的字典,将其指定为插件类)。一旦你有了包含接口的那些类型的列表,将它们指定为插件,你就可以使用System.Activator类随意动态地实例化它们。在应用程序启动时对加载项类进行初始探测,然后使用抽象工厂根据类型或其他可使用.net属性归属于类的其他元数据加载插件。
如果您需要特定的代码示例,我可以为您执行此操作,但是,如果您打算构建,则应花时间熟悉System.Reflection,System.Activator和.net属性一个强大而灵活的附加系统。
享受!
答案 1 :(得分:1)
我是一名Java人员,但因为您的问题与软件设计模式有关......
Strategy Pattern很可能会在非常抽象的层面帮助你。所以,也许你的核心应用程序有一套非常基本的“策略”用于操作...而不是创建一个菜单栏,你可以调用一个简单的菜单栏策略对象来为你创建它。然后,提供交换策略的方法(因此,部署插件本质上是在受影响的对象上调用一堆setStrategy()方法的问题,或者你喜欢)。该插件将提供替代策略。至于插件类的运行时加载,我不熟悉C#来回答这个问题。
正如我之前所说,这一切都非常抽象。尽量避免反射 - 尽管有时是必要的,但使用反射会有性能,安全性和设计缺点。
希望有所帮助!
答案 2 :(得分:0)
几乎所有“插件”架构都将基于Builder模式的某些变体 - 几乎就是定义。