Я пытаюсь ввести DI (с Autofac ) в существующее приложение Windows Forms.
Это приложение имеет базовую архитектуру плагинов, в которой каждый плагин отображает свою собственную форму.При запуске приложение сканирует зарегистрированные сборки для типов, которые реализуют IPlugin
, а затем активирует их, используя Activator.CreateInstance
:
public interface IPlugin
{
Form MainForm { get; }
}
I не может изменить данную заданную структуру.Это означает, что каждый класс плагина создается не средствами 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<MainForm>();
// ^ 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<MainForm>().SingleInstance();
// ... more plugin-specific registrations go here...
}
}
internal class MainForm : Form { /* ... */ }
Я также не уверен, можно ли создать контейнер в конструкторе плагина, а затем просто забыть об этом, но оставить его для автоматического подключения в фоновом режиме, это нормально?