C# C语言中的插件模式#

C# C语言中的插件模式#,c#,interface,plugin-pattern,C#,Interface,Plugin Pattern,问题: 我正在构建一个框架,它接受一个文件,转换它并执行它。该框架应该能够处理任何类型的文件,为此,我提供了一种上传DLL的方法,其中包含用于翻译文件和执行文件的类和方法。我想要的是定义插件接口的最佳方法 解决方案A: 定义一组公开可用的接口。插件应该实现这些接口 解决方案B: 定义一些公开可用的抽象类。插件应该嵌入并覆盖这些类上的抽象方法 解决方案C: 在代码内部传递接口,创建一个公开的抽象类,以允许插件扩展已选择 之所以选择此解决方案,是因为它支持基本实现(在本例中非常方便)。之所以选择它,

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

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

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

解决方案C:
在代码内部传递接口,创建一个公开的抽象类,以允许插件扩展已选择
之所以选择此解决方案,是因为它支持基本实现(在本例中非常方便)。之所以选择它,是因为它支持代码中的模拟。组合框架非常优秀,但对于像这个应用程序这样只需要有限扩展性的轻量级应用程序来说有点过头了

解决方案D:
实现一个组合框架(比如)并围绕它构建

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

提前感谢,

技术测试花花公子

在最低级别,我相信您需要接口。这使得大多数模拟框架能够轻松地提供假货。围绕代码,您应该传递接口。如果您需要一些可以重构为抽象基类的基本实现,那么就这样做。抽象基类和接口不是相互排斥的概念。有时两者兼有是有意义的。

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

您可以提供一些定义插件特定行为所必需的
abstract
方法,而
virtual
方法提供了一种可以选择覆盖默认行为的方法

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


基本上,抽象类可以提供接口提供的所有功能,等等。因此,对于未来的扩展来说,这可能是一个更好的选择。

您正在编写的内容与托管可扩展性框架所支持的内容似乎有些相似:。也许只是使用它,避免重新发明轮子?

因此作为一个例子,我将有
ITranslator
,它将声明所有有效的翻译方法,以及一个抽象类TranslatorBase,它声明一些基本的实现。当我开始使用反射来查找DLL中的实现时,问题就出现了。我是否只搜索
ITranslator
实现?或者我真的需要他们继承
TranslatorBase
?其中哪些是公开的,哪些只是供内部使用?谢谢你的回答请告诉我,我对这个问题所做的编辑是否充分地封装了你的答案+1,以定义抽象类实现的优点MEF和MAF是什么?我不知道你在谈论翻译时是什么意思,但是MEF和MAF(可能包含了一些常用的DI内容)是为构建复合应用程序而设计的。您可能需要浏览一下Prism(复合WPF)代码,全部内容都是关于复合应用程序,即模块/插件的。如果你谈论的是web应用程序,那么Orchard CMS的来源可能也很有趣。这些家伙在ASP.NETMVC之上构建了一个很好的插件基础设施。所讨论的应用程序是一个Web服务,位于服务器上。这个想法是,许多人可以提供“翻译”文件,有些人可以提供插件。当人们提供他们的文件时,他们会选择应该使用哪个插件来“翻译”它们。实际的UI端(WPF、MVC等)现在不是问题。到目前为止,我一直远离预定义框架,因为它们往往相当不适合。如果我出错,请纠正我。我还没有使用MAF,不知道它是否仍然由MS维护,但我认为至少MEF应该提供必要的基础设施。它不仅限于GUI的东西。虽然我认为@Chris Shain是对的,但不要重新发明轮子。顺便问一下:什么是安全?我的意思是有人可以上传恶意代码作为插件。似乎需要一个沙箱。同意沙箱。把它作为一个答案贴出来,这样我就可以对它进行投票了。对于所选答案的后续步骤和理由,可以使用几行代码来实现一个插件引擎,请看,重框架并不总是必需的