使用 winforms 创建依赖注入 asp 核心 6 时遇到问题?

Getting issue with the dependency injection asp core 6 with winforms creation?

Github link to sample project

   static void Main()
    {
        ApplicationConfiguration.Initialize();

        var builder = new HostBuilder()
         .ConfigureServices((hostContext, services) =>
         {
             services.AddTransient<Form1>();
             services.AddTransient<Form2>();

         });

        var host = builder.Build();

        using (var serviceScope = host.Services.CreateScope())
        {
            IServiceProvider services = serviceScope.ServiceProvider;
            Application.Run(services.GetRequiredService<Form1>());
        }
  
        
    }

Form1 是 MDI MdiParent,我正在其中注入 Form 2

public partial class Form1 : Form
    {
        private readonly Form2 form2;

        public Form1(Form2 form2)
        {
            InitializeComponent();
            this.form2 = form2;
        }

        private void form2ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.form2.MdiParent = this;
            this.form2.Show();
        }
    }

当我通过单击菜单打开 Form2 时,它使用 [X] 按钮打开和关闭它 当我重新打开它时出现错误 System.ObjectDisposedException: 'Cannot access a disposed object.
Object name: 'Form2'.'

表单在关闭时被释放。

我建议使用工厂

static void Main() {
    ApplicationConfiguration.Initialize();

    var builder = new HostBuilder()
        .ConfigureServices((hostContext, services) => {
            services.AddTransient<Form1>();
            services.AddTransient<Form2>();
            //Form2 factory delegate
            services.AddSingleton<Func<Form2>>(sp => () => sp.GetRequiredService<Form2>());
        });

    var host = builder.Build();

    using (var serviceScope = host.Services.CreateScope()) {
        IServiceProvider services = serviceScope.ServiceProvider;
        Application.Run(services.GetRequiredService<Form1>());
    }
}

每次单击按钮时初始化一个新表单。

public partial class Form1 : Form {
    private readonly Func<Form2> factory;

    public Form1(Func<Form2> factory) {
        InitializeComponent();
        this.factory = factory;
    }

    private void form2ToolStripMenuItem_Click(object sender, EventArgs e) {
        Form2 form2 = factory();
        form2.MdiParent = this;
        form2.Show();
    }
}