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 完全不同。