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