C#中的插件模式

本文关键字:模式 插件 | 更新日期: 2023-09-27 18:05:46

问题:
我正在构建一个接受文件的框架,翻译执行。该框架应该能够处理任何类型的文件,为此,我提供了一种上传DLL的方法,该方法包含转换执行文件的类和方法。我正在寻找定义插件接口的最佳方式

解决方案A:
定义一组公开可用的接口。插件应该实现这些接口。

解决方案B:
定义一些公开可用的抽象类。插件应该包含并覆盖这些类上的抽象方法。

解决方案C:rcravens
在代码内部传递接口,创建一个可公开使用的抽象类,以实现插件的可扩展性已选择
之所以选择这个解决方案而不是接口,只是因为它支持基本实现(在这种情况下很方便(。它被选在抽象类之前,只是因为它允许在代码中进行嘲讽。组合框架非常出色,但对于像这个应用程序这样只需要有限扩展性的轻量级应用程序来说,有点过头了。

解决方案D:周和Chris Shain
实现一个组合框架(如托管可扩展性框架(MEF((并围绕它构建

如果出现任何新的解决方案,我会将它们添加到此列表中。答案将交给最有能力证明其解决方案的人(可能有优势和局限性(

提前感谢,
技术测试Dude

C#中的插件模式

您所写的内容听起来可疑地类似于托管扩展性框架所支持的内容:http://mef.codeplex.com/.也许只是使用它,避免重新发明轮子?

在最低级别,我认为您需要接口。这使得大多数mocking框架可以轻松地提供fake。您应该在代码周围传递接口。如果你需要一些可以重构为抽象基类的基本实现,那就去做吧。抽象基类和接口不是互斥的概念。有时两者兼得是有道理的。

我认为接口和抽象类之间没有更好的解决方案,这实际上取决于您需要什么。但就个人而言,我可能会选择抽象类,因为它提供了更多的灵活性。

您可以提供一些abstract方法,这些方法对定义插件的特定行为至关重要,而virtual方法提供了一种可选地覆盖默认行为的方法。

抽象类还可以提供一些对插件作者有用的实用方法。

基本上,抽象类可以提供接口提供的所有,等等。所以这可能是一个更好的未来扩展。