如何检索当前的 Autofac 生命周期范围并解析 Winform 应用程序中的嵌套表单

How can I retrieve current Autofac lifecyclescope and resolve nested forms in a Winform app

我有一个使用 Autofac 的 Winforms 应用程序 IoC/DI

我已经设置了 autofac 配置,因此所有表单都可以通过 container/LCS 解析。

我想通过构造函数注入来注入每个Winforms相关的服务。

所以在我的应用程序中,我创建了容器和根生命周期范围并解析了主窗体:

using (Autofac.IContainer container = Startup.Autofac.Initialize())
{
    FormFactory winfactory = FormFactory.Init(container);
    var form = FormFactory.CreateForm<Form1>();
    Application.Run(form);
}

这按预期工作,我的服务注入正常。

现在主窗体上的用户交互需要打开一个新的详细信息窗体。所以主窗体需要解析并显示明细窗体。我想在主窗体的当前生命周期范围内执行此操作,但我不知道如何获取对它的引用!

在 MVC 中,它似乎捆绑到 Nuget 包中的 MVC/Autofac 集成中,使用 DependencyResolver.Current。但这在 MVC 应用程序之外不可用。

任何人都可以为我提供一些帮助,并最终提供一些解决 Winforms 应用程序中嵌套表单的最佳实践吗?

谢谢

Winforms 应用程序中没有正式集成 Autofac。 Winforms 应用程序中没有 request/response 或 "request lifecycle" 的内置概念。 Winforms 是有状态的,与应用程序的集成是基于每个应用程序的。

这意味着什么 - 我知道这不会是你想要的答案,但它 答案 - 你必须将 Autofac 集成写入您的自定义 Winforms 应用程序

您可能需要添加 Microsoft CommonServiceLocator package into your app, which basically provides the DependencyResolver implementation for generic app types. Autofac has integration with CommonServiceLocator.

但是,请记住 Autofac 会跟踪可释放项(IDisposable 实现),因此如果您直接从根容器中解决问题,您可能会遇到内存泄漏 - 从根容器中解析可释放项,默认情况下,不会被处置 直到您处置容器 There is documentation on controlling scope and lifetime for components.

这意味着您需要创建 Autofac 生命周期作用域并从中解析,处理子作用域以进行清理。这就是 MVC 风格的每个请求生命周期的工作方式 (and there's doc on that, too)。

除此之外,我无法提供 "best practice" 或 "guidance"。 Winforms 中没有组合根 - 没有内置的 DI 挂钩,所以它确实是 特定应用程序 。我不能说您的应用程序是 "good" 还是 "recommended"。我不能说某些东西是 "isn't good" 还是 "bad practice." 都是特定于应用程序的,您将不得不做一些跑腿的工作。