Autofac 6 - 注册装饰器同时实现另一个接口

Autofac 6 - register a decorator as also implementing another interface

在 Autofac 6 之前,我可以这样做:

builder.RegisterType<ResourceStorageParallelOperationsLimitDecorator>()
       .As(new DecoratorService(typeof(IResourceStorage)))
       .As<INetworkQueueMetrics>();

简而言之,我可以告诉 Autofac 所有 IResourceStorage 个实例都应该由 ResourceStorageParallelOperationsLimitDecorator 装饰,并且这个装饰器还提供服务 INetworkQueueMetrics.

现在,在 v6 中,如果我这样做:

builder.RegisterDecorator<ResourceStorageParallelOperationsLimitDecorator,
                          IResourceStorage>()

我无法继续与 .As<>(...) 通话。

如果我尝试修改 ResourceStorageParallelOperationsLimitDecorator 的注册,例如:

builder.RegisterDecorator<ResourceStorageParallelOperationsLimitDecorator,
                          IResourceStorage>();
builder.RegisterType<ResourceStorageParallelOperationsLimitDecorator>()
       .As<INetworkQueueMetrics>()
       .SingleInstance();

然后这导致 INetworkQueueMetricsIResourceStorage 被解析为 ResourceStorageParallelOperationsLimitDecorator 的两个不同实例,请参见以下测试:

[Test]
public void INetworkQueueMetrics_resolves_to_the_same_instance_as_ResourceStorage()
{
  var container = BuildContainer();
  var resourceStorage = container.Resolve<IResourceStorage>();
  var networkMetrics = container.Resolve<INetworkQueueMetrics>();

  resourceStorage.Should().BeSameAs(networkMetrics); // <<<< FAILS
}

ContainerBuilder.RegisterDecorator() 有很多覆盖,也许其中之一可以让我做我需要的,但坦率地说,我不太清楚它们的用法。

知道如何使用 Autofac v6 获得我想要的语义吗?

您看到的是故意行为。装饰器的作用是装饰——它基本上是一个“增值代理”。装饰器本身并不会公开整个单独的服务——它的唯一目的是包装其他东西。它只是在之前有点意外地起作用——通过流畅的注册语法运行方式中的漏洞抽象。这个漏洞被最新版本“堵住了”。

如果您需要一些东西来包装组件并更改公开的服务[​​=21=],那就是适配器Autofac does have adapter support, too

当然,如果您需要更通用的东西(例如“记录对此事物的每次调用”),you can use type interceptors