Я пытаюсь ввести 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 { /* ... */ }
Я также не уверен, есть ли создать контейнер в конструкторе плагина, а затем просто забыть об этом, но оставить его для автоматического подключения в фоновом режиме, нормально?