如何在 WinForms 中正确实现 Di

How to implement Di in WinForms properly

我正在构建一个 Winforms 应用程序。 我的项目很少 主项目是winforms项目 我的服务有数据库项目(使用 EF 核心)和业务项目 我正在使用 Ninject 进行业务服务的 DI 注入。我正在使用我所有已注册的绑定在主窗体中初始化 StandartKernel。 因此,当我从主窗体打开一个窗体时,我将所需的服务从内核传递给窗体的构造函数。 问题是当我想从其他表单(不是主要表单)创建表单时 例子: 从主窗体我创建 ClientForm 但是我想向客户的集合 "Cars" 添加一个新对象,所以我想直接从 ClientForm 创建一个 Car 表单。这就是问题所在:在 ClientForm 中,我没有 CarService 可以传递给新表单,我只有 ClientService。 在这样的项目中进行 DI 的最佳解决方案是什么? 我正在考虑让我所有的服务静态化但是...... 还有其他解决方案吗?

好吧,这些天我正在做类似的事情。我正在使用 Unity Container 制作我的 DI。代码不完整,根本没有优化。

如果您看过或使用过 ASP.NET API,我尝试在 windows 表单应用程序中进行相同的操作。

我使用如下扩展方法将所有表单添加到 Unity 容器中。

    public static void AddForms(this IUnityContainer container, Assembly assembly = null)
    {
        if (assembly == null) assembly = Assembly.GetCallingAssembly();

        foreach (var form in assembly.GetTypes().Where(x => typeof(Form).IsAssignableFrom(x)))
        {
            var initForm = form.GetCustomAttribute<InitialFormAttribute>();
            if (initForm != null)
            {
                container.RegisterType(typeof(Form), form, "InitialForm", new TransientLifetimeManager());
            }
            else
            {                    
                container.RegisterType(form, new TransientLifetimeManager());
            }

        }
    }

并使用一些编码来实现启动,就像 ASP.NET 中一样。在启动时,我将 EF Core DbContext 添加到容器中,就像我添加了所有我需要的东西一样,以便让 Unity 容器为我创建表单实例,并且我始终可以访问表单中的服务。

如果您想查看完整代码,请在下方评论。