Является ли этот плагин каркасом IoC / DI? - PullRequest
2 голосов
/ 26 сентября 2011

Я работаю над тем, чтобы приложение 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?

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

Это похоже на архитектуру плагина, которая использует Inversion of Control, но не использует Dependency Injection. Похоже на то, как работает MEF.

1 голос
/ 26 сентября 2011

Согласен с ответом Ричарда. Я думаю, что то, что у вас есть, в конечном итоге является рудиментарным локатором услуг. Контейнер DI будет обеспечивать фактическое автоматическое создание типов на основе других типов в контейнере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...