我有一个应用程序,它不通过控制器接收普通的HTTP请求,而是侦听和接收消息(AMQP协议)以启动其逻辑流程。
我的应用程序可能会同时接收和处理多个消息。我有一个对象将在整个过程中在几个不同的服务/类中收集信息/数据,以便我在最后使用它。但我需要按接收的每个消息分离数据,就像“Scoped”注入将注入实例与其他HTTP请求分离一样。
因此,我的用例非常类似于在普通API中使用Scoped注入对象的方式,但我接收的是侦听器中的消息,而不是新的HTTP请求。
是否有任何方法可以为每个接收的消息创建自定义范围,无论是通过某种配置还是使代码在Listener.MessageReceived(Message message)方法中作为第一件事创建新范围?
想象一个如下的流程:
我的应用程序可能会同时接收和处理多个消息。我有一个对象将在整个过程中在几个不同的服务/类中收集信息/数据,以便我在最后使用它。但我需要按接收的每个消息分离数据,就像“Scoped”注入将注入实例与其他HTTP请求分离一样。
因此,我的用例非常类似于在普通API中使用Scoped注入对象的方式,但我接收的是侦听器中的消息,而不是新的HTTP请求。
是否有任何方法可以为每个接收的消息创建自定义范围,无论是通过某种配置还是使代码在Listener.MessageReceived(Message message)方法中作为第一件事创建新范围?
想象一个如下的流程:
public class Listener {
ServiceClassA serviceClassA //injected in constructor
CustomLogger customLogger // (HAS TO BE SAME OBJECT INJECTED INTO ServiceClassA, ServiceClassB and Listener)
public void ReceiveMessage(Message message) {
using (var scope = CreateNewScope()) {
try {
serviceClassA.DoStuff();
} catch(Exception e) {
Console.Write(customLogger.GetLogs())
}
}
}
}
public class ServiceClassA {
ServiceClassB serviceClassB //injected in constructor
CustomLogger customLogger //(HAS TO BE SAME OBJECT INJECTED INTO ServiceClassA, ServiceClassB and Listener)
public void DoStuff() {
customLogger = ResolveCustomLogger(); // how do I make sure I can get/resolve the same object as in Listener (without having to pass parameters)
var data = // does stuff
customLogger.Log(data);
serviceClassB.DoStuff();
}
}
public class ServiceClassB {
CustomLogger customLogger //(HAS TO BE SAME OBJECT INJECTED INTO ServiceClassA, ServiceClassB and Listener)
public void DoStuff() {
customLogger = ResolveCustomLogger(); // how do I make sure I can get/resolve the same object as in Listener (without having to pass parameters)
var data = // does other stuff
customLogger.Log(data);
}
}
我的自定义记录器不仅可以用于1或2个服务层,可能有许多层,我可能只想在最底层使用CustomLogger,但之后我希望它可以在顶层访问,以检索其中存储的数据。
非常感谢。
serviceClassA
注入到Listener
中,而是从Listener
内部创建的scope
中解析它,并将CustomLogger
注册为Singleton
。 - StevenCustomLogger
注册为单例。 - Steven