Autofac 中的事件处理程序方法注入
Event handlers methods injection in Autofac
我开始在我的项目中使用 Autofac。这是简单的聊天应用程序。我有 Messaging
class 属于 Node
class。每个 Node
对象都有自己的 Messaging
实例。 Messaging
包含多个用于通知传入消息等的事件。目前我的代码如下所示:
Network.cs(在图书馆)
var scope = container.BeginLifetimeScope(b => { b.RegisterInstance(host).As<IHost>(); });
var node = scope.Resolve<Node>();
NodeCreated?.Invoke(this, node);
Program.cs(在客户端程序集中)
Network.NodeCreated += (sender, node) => { _ = new NodeEventsHandlers(node); };
NodeEventsHandlers.cs(在客户端程序集中)
public NodeEventsHandlers(INode node)
{
this.node = node;
node.Messaging.MessageReceived += OnMessageReceived;
...
一团糟,没有利用 DI。如何使用 Autofac 将事件处理程序方法注入 Messaging
?我找到了 this,但我不确定它对我的情况是否有用。
这里真的没有足够的内容来保证一个完整的答案。例如,您提到您有一个 Messaging
class 但您从未展示过它,这就是整个问题所围绕的问题。不过,我可以稍微简化一下。
依赖注入是为了构建对象...这听起来像是我在说显而易见的事情,但这是一个重要的观点,因为如果我没看错问题,你是在问如何进行依赖注入连接事件处理程序。这不是 DI 的目的,更具体地说,这并不是 Autofac——作为一个依赖注入框架——能够帮助你的东西。
对于 Autofac 可以提供哪些帮助的非常非常高级概念,请思考:
- 如果您可以改用
new
,Autofac 可以提供帮助。即调用构造函数并传递参数。
- 如果你可以使用
Activator.CreateInstance
(调用构造函数的反射方式),Autofac可以提供帮助。
- 如果你想运行一些代码你提供 after the object is constructed or when the object is disposed,Autofac 可以提供帮助。
但是,Autofac(或我知道的任何其他 DI 框架)中没有可以“自动”执行某种事件连接的工具。那是您必须自己编写的代码。
我可能会看到您使用 Autofac OnActivating
event 调用一些代码 您编写的 在对象被解析时执行事件连接的代码,但那是尽善尽美。
如果我不得不猜测,我会说您可能正在寻找更接近服务总线的东西,您可以在其中使用 pub/sub 框架注册节点that 处理将侦听器附加和分离事件。这与 Autofac 完全不同。
我开始在我的项目中使用 Autofac。这是简单的聊天应用程序。我有 Messaging
class 属于 Node
class。每个 Node
对象都有自己的 Messaging
实例。 Messaging
包含多个用于通知传入消息等的事件。目前我的代码如下所示:
Network.cs(在图书馆)
var scope = container.BeginLifetimeScope(b => { b.RegisterInstance(host).As<IHost>(); });
var node = scope.Resolve<Node>();
NodeCreated?.Invoke(this, node);
Program.cs(在客户端程序集中)
Network.NodeCreated += (sender, node) => { _ = new NodeEventsHandlers(node); };
NodeEventsHandlers.cs(在客户端程序集中)
public NodeEventsHandlers(INode node)
{
this.node = node;
node.Messaging.MessageReceived += OnMessageReceived;
...
一团糟,没有利用 DI。如何使用 Autofac 将事件处理程序方法注入 Messaging
?我找到了 this,但我不确定它对我的情况是否有用。
这里真的没有足够的内容来保证一个完整的答案。例如,您提到您有一个 Messaging
class 但您从未展示过它,这就是整个问题所围绕的问题。不过,我可以稍微简化一下。
依赖注入是为了构建对象...这听起来像是我在说显而易见的事情,但这是一个重要的观点,因为如果我没看错问题,你是在问如何进行依赖注入连接事件处理程序。这不是 DI 的目的,更具体地说,这并不是 Autofac——作为一个依赖注入框架——能够帮助你的东西。
对于 Autofac 可以提供哪些帮助的非常非常高级概念,请思考:
- 如果您可以改用
new
,Autofac 可以提供帮助。即调用构造函数并传递参数。 - 如果你可以使用
Activator.CreateInstance
(调用构造函数的反射方式),Autofac可以提供帮助。 - 如果你想运行一些代码你提供 after the object is constructed or when the object is disposed,Autofac 可以提供帮助。
但是,Autofac(或我知道的任何其他 DI 框架)中没有可以“自动”执行某种事件连接的工具。那是您必须自己编写的代码。
我可能会看到您使用 Autofac OnActivating
event 调用一些代码 您编写的 在对象被解析时执行事件连接的代码,但那是尽善尽美。
如果我不得不猜测,我会说您可能正在寻找更接近服务总线的东西,您可以在其中使用 pub/sub 框架注册节点that 处理将侦听器附加和分离事件。这与 Autofac 完全不同。