Я работаю над тем, чтобы приложение ASP.NET C # разрешало плагины без перекомпиляции хост-приложения при установке новых плагинов.
Вот мой класс загрузчика плагинов (основанный на учебниках, найденных в Интернете.)
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();
}
Является ли эта структура IoC или DI?Плагин ссылается на хост, а не наоборот.Похоже, это согласуется с концепцией инверсии контроля.Есть ли принципиальная разница между этим кодом и IoC / DI?