我正在尝试将 DI(使用Autofac)引入现有的 Windows 窗体应用程序。
这个应用程序有一个基本的插件架构,每个插件都显示自己的表单。启动时,应用程序会扫描已注册的程序集以查找实现 的类型,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<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 { /* ... */ }
我也不确定是否在插件构造函数中创建一个容器然后简单地忘记它,而是让它在后台进行自动装配,可以吗?