首页 > 解决方案 > 如何在 WinForms 中正确实现 Di

问题描述

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

标签: c#.netwinformsninject.net-framework-version

解决方案


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

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

我使用如下扩展方法将我的所有表单添加到 Unity Container。

    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 容器为我创建表单实例所需的一切一样,并且我始终可以访问表单中的服务。

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


推荐阅读