gpt4 book ai didi

c# - Autofac 通用装饰器正在复制组件

转载 作者:行者123 更新时间:2023-11-30 18:32:09 25 4
gpt4 key购买 nike

我发现我认为可能是 Autofac 中的错误,但我想看看是否有人有可能的解决方案或解决方法,以便我可以完成这项工作。

基本上我已经设置了一个通用的装饰器,它工作正常。问题是,一旦我使用配置委托(delegate)调用 BeginLifetimeScope(),它就会错误地解析同一类型的多个组件。如果我不使用带有 BeginLifetimeScope() 的配置委托(delegate),那么它可以正常工作。不幸的是,我需要向我的子作用域添加额外的依赖项,因此不使用配置委托(delegate)不是一种选择。

这是一个演示问题的例子:

var builder = new ContainerBuilder();
builder.RegisterType<Dependency>()
.Named<IDependency<object>>("service");
builder.RegisterGenericDecorator(
typeof(Decorator<>), typeof(IDependency<>), "service", "decorated");
var container = builder.Build();

// Returns 1
var scope1 = container.BeginLifetimeScope();
Console.WriteLine(
scope1.ResolveNamed<IEnumerable<IDependency<object>>>("decorated").Count());

// Returns 2 - notice the configAction doesn't even have to do anything
var scope2 = container.BeginLifetimeScope(r => { });
Console.WriteLine(
scope2.ResolveNamed<IEnumerable<IDependency<object>>>("decorated").Count());

这是我的假类型:

interface IDependency<T> { }

class Dependency : IDependency<object> { }

class Decorator<T> : IDependency<T> {}

如有任何帮助,我们将不胜感激!

最佳答案

这看起来确实像是一个错误。作为解决方法,我最终执行了以下操作:

var param = new TypedParameter(typeof(IDecoratorDependency), new DecoratorDependency());
var decorated = scope.ResolveNamed<IEnumerable<IDependency<object>>>("decorated", param);

这对我的用例来说已经足够好了。但是,此方法不够灵活,因为它只允许我向根对象提供参数,在本例中为 Decorator<T>。 ,但不是它的任何依赖项。

关于c# - Autofac 通用装饰器正在复制组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18990405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com