2011-09-26 47 views
2

我正在为我的ASP.NET C#应用程序开发一种方法,以便在安装新插件时允许插件无需重新编译主机应用程序。这个插件框架IoC/DI?

这里是我的插件加载类(基于教程在网上找到。)

public class PluginLoader 
{ 
    public static IList<IPlugin> Load(string folder) 
    { 
     IList<IPlugin> plugins = new List<IPlugin>(); 

     // Get files in folder 
     string[] files = Directory.GetFiles(folder, "*.plug.dll"); 
     foreach(string file in files) 
     { 
      Assembly assembly = Assembly.LoadFile(file); 
      var types = assembly.GetExportedTypes(); 
      foreach (Type type in types) 
      { 
       if (type.GetInterfaces().Contains(typeof(IPlugin))) 
       { 
        object instance = Activator.CreateInstance(type); 
        plugins.Add(instance as IPlugin); 
       } 
      } 
     } 
     return plugins; 
    } 
} 

的概念是建立在新的插件可以使用主机应用程序IPlugin接口。然后加载器搜索可用的DLL并找到IPlugin类型的类。那么这些实例化和我的主机应用程序可以使用它们看起来合适。

例如,它可以这样做:

protected void Page_Load(object sender, EventArgs e) 
    { 
     StringBuilder sb = new StringBuilder(); 
     string folder = Server.MapPath("~/bin/"); 
     path.Text = folder; 

     var plugins = PluginLoader.Load(folder); 
     if (plugins.Count == 0) 
      sb.Append("No plugins found"); 
     else 
     { 
      sb.Append("<ul>"); 
      foreach (var plug in plugins) 
      { 

       sb.AppendFormat("<li>Default: {0}</li>", plug.Label); 
       plug.SetLabel("Overwrote default label."); 
       sb.AppendFormat("<li>New: {0}</li>", plug.Label); 
      } 
      sb.Append("</ul>"); 
     } 

     message.Text = sb.ToString(); 
    } 

这是什么样的结构或国际奥委会DI是什么?插件引用主机,而不是其他方式。这似乎与控制反转概念一致。这段代码和IoC/DI之间有根本的区别吗?

+0

看起来更像是一个服务定位符模式而不是IoC模式。 IoC是为了避免服务定位器而发明的。 – pvoosten

回答

2

这看起来像一个利用控制反转但不使用依赖注入的插件架构。它似乎与MEF的工作方式类似。

1

同意Richard的回答。我认为你最终会成为一个基本的服务定位器。 DI容器将根据容器中的其他类型提供实际的类型自动实例化。