我正在为我的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之间有根本的区别吗?
看起来更像是一个服务定位符模式而不是IoC模式。 IoC是为了避免服务定位器而发明的。 – pvoosten