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();
然后这导致 INetworkQueueMetrics
和 IResourceStorage
被解析为 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。
在 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();
然后这导致 INetworkQueueMetrics
和 IResourceStorage
被解析为 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。