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

问题描述 投票:0回答:2

在 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 获得我想要的语义吗?

c# decorator autofac
2个回答
3
投票

您所看到的是一种故意行为。装饰器的重点是“装饰”——它基本上是一个“增值代理”。装饰器本身并不公开整个单独的服务 - 它的唯一目的是包装其他东西。它以前只是在某种程度上意外地起作用 - 通过流畅的注册语法运行方式中的漏洞抽象。该漏洞已被最新版本“堵住”。 如果您需要一些东西来包装组件

并更改公开的服务

这是一个适配器并且Autofac也有适配器支持 当然,如果您需要更通用的功能(例如“记录对此事物的每次调用”),

您可以使用类型拦截器


0
投票

public interface IService { void SetValue(MyType value); } public interface ICachedService: IService { MyType CachedValue { get; } }

我的注册方式如下:

builder.RegisterType<Service, IService>().SingleInstance(); builder.RegisterDecorator<CachedService, IService>(); builder.Register<ICachedService>(ctx =>(ICachedService)ctx.Resolve<IService>());

© www.soinside.com 2019 - 2024. All rights reserved.