c# - 如何创建仅在插件可用时才调用函数的插件机制?

标签 c# design-patterns architecture asp.net-mvc-4

对不起,如果我不够清楚,我很难写这个问题。

我下载了一个开源软件。我想扩展功能,所以我想创建封装功能的模块,这些模块将是 .dll 文件。 我想要一个完全独立于另一个:如果我在配置文件中将一个键设置为 true 并且如果文件夹中存在 DLL,则应该加载插件。

问题是:如何动态调用插件(仅应用插件调用)?

如果我直接引用插件类,我将不得不引用插件dll,但我希望能够在没有插件的情况下运行核心软件。是否有任何设计模式或其他机制允许我仅在应用插件时加载和使用 DLL,并且仍然可以在没有插件的情况下运行核心软件?

最佳答案

有多种方法可以实现这一点,我将在此处描述一个简单的解决方案。

创建一个公共(public)接口(interface),每个插件都必须实现,以便与核心应用程序集成。这是一个例子:

// Interface which plugins must implement
public interface IPlugin
{
  void DoSomething(int Data);
}

// Custom plugin which implements interface
public class Plugin : IPlugin
{
  public void DoSomething(int Data)
  {
    // Do something
  }
}

要真正从 dll 加载插件,您需要使用反射,例如:

// Load plugin dll and create plugin instance
var a = Assembly.LoadFrom("MyCustomPlugin.dll");
var t = a.GetType("MyCustomPlugin.Plugin");
var p = (IPlugin)Activator.CreateInstance(t);

// Use plugin instance later
p.DoSomething(123);

您可以为您的插件程序集和类使用某种命名约定 以便您可以轻松加载它们。

关于c# - 如何创建仅在插件可用时才调用函数的插件机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14926287/

相关文章:

c# - 当滚动条可见时,TableLayoutPanel 不在底部显示填充

c# - 替换特定字符之间的数据

java - 客户端-服务器数据同步策略[Java]

c++ - C++ 中带有模板的装饰器模式

c# - MSBuild:升级到 VS 2010 后出现 TlbImp 错误

c# - 使用 SharePoint Web 服务进行身份验证

java - 使用 getInstance 的单例与公共(public)声明

C++分离数据和逻辑

sql-server - SQL Server - 我“真正”需要多少用户?

c# - 有关在 .NET 中使用消息队列服务总线的问题