DI (Autofac) в архитектуре плагина: подходит ли один отдельный контейнер DI для каждого плагина?

Я пытаюсь ввести DI (с Autofac ) в существующее приложение Windows Forms.

Это приложение имеет базовую архитектуру подключаемых модулей, где каждый подключаемый модуль отображает свои собственная форма. При запуске приложение сканирует зарегистрированные сборки на предмет типов, реализующих IPlugin , а затем активирует их с помощью Activator.CreateInstance :

public interface IPlugin
{
    Form MainForm { get; }
}

Я не могу изменить данную структуру . Это означает, что каждый класс подключаемого модуля создается средствами, отличными от DI, и мне кажется, что поэтому мне придется загружать отдельный контейнер DI для каждого подключаемого модуля.

Мой вопрос: , создает ли отдельный ContainerBuilder и контейнер для каждого плагина, и все еще достаточно эффективно? (Будет примерно 10 различных плагинов.) Или должен быть только один контейнер DI для всего приложения?

Я привел пример кода моего текущего решения ниже.


using Autofac;
using System.Windows.Forms;

public class Plugin : IPlugin  // instantiated by Activator
{
    public Form MainForm { get; private set; }

    public Plugin()  // parameter-less constructor required by plugin framework
    {
        var builder = new ContainerBuilder();
        builder.RegisterModule(new Configuration());
        var container = builder.Build();

        MainForm = container.Resolve();
        // ^ preferred to new MainForm(...) because this way, I can take
        //   advantage of having dependencies auto-wired by the container.
    }
}

internal class Configuration : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType().SingleInstance();
        // ... more plugin-specific registrations go here...
    }
}

internal class MainForm : Form { /* ... */ }

Я также не уверен, есть ли создать контейнер в конструкторе плагина, а затем просто забыть об этом, но оставить его для автоматического подключения в фоновом режиме, нормально?

8
задан stakx supports GoFundMonica 9 November 2016 в 15:55
поделиться