【发布时间】:2019-09-11 19:01:27
【问题描述】:
我有一个使用 Autofac 的控制台应用程序。此应用程序接受来自 AMQP 队列的消息并处理它们。每次收到消息时,应用程序都会创建一个新的 Autofac 生命周期范围并在其中注册一些内容;值得注意的是,一个类(我们称之为Context)包含有关消息和触发它的用户的信息。大多数实际功能(一组具有令人讨厌的大依赖树的服务类)在根 Autofac 范围内注册为InstancePerLifetimeScope。这会导致大量内存分配和一些延迟,因为每次收到消息时都会重新实例化所有这些类。
我想将这些服务类中的大多数转换为SingleInstance 依赖项,因为它们在概念上只是函数的容器,并且除了注入其中的依赖项之外没有任何状态。 Autofac 不会让我这样做,因为我注入的 Context 对象是 InstancePerLifetimeScope。没关系,由于显而易见的原因,这不应该起作用(上下文会在一条消息后过时,Autofac 无法在不重新实例化整个对象的情况下重新注入它)。
但是,即使我注入 Func<Context> 或 ContextProvider 对象也是如此。我知道这是因为 Autofac 仍在寻找 Context,它们应该在我注册 SingleInstance 类的根范围内返回,而不是在当前生命周期范围内。
那么,有没有办法让 Autofac 注入一个类似 () => GetCurrentInnermostLifetimeScope().Resolve<Context>() 的函数?
我已经看到其他一些关于此的 SO 问题,但它们都分为两类:要么“将所有内容注册为 InstancePerLifetimeScope”(我试图避免),要么“使用 ASP.NET 的 @987654332 @"(在控制台应用程序中不是这样)。
【问题讨论】: