我发现我认为可能是Autofac中的一个错误,但我想知道是否有人有可能的解决方案或解决方法,所以我可以做到这一点。
基本上我已经设置了一个通用装饰器,它工作正常。问题是,只要我用配置委托调用BeginLifetimeScope()
,它就会错误地解析同一类型的多个组件。如果我不使用BeginLifetimeScope()
的配置委托,那么它可以正常工作。不幸的是,我需要在子范围中添加其他依赖项,因此不能使用配置委托。
这是一个解释问题的例子:
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> {}
非常感谢任何帮助!
答案 0 :(得分:0)
它看起来像是一个错误。作为一种解决方法,我最终做了以下事情:
var param = new TypedParameter(typeof(IDecoratorDependency), new DecoratorDependency());
var decorated = scope.ResolveNamed<IEnumerable<IDependency<object>>>("decorated", param);
这对我的用例来说已经足够了。但是,这种方法不灵活,因为它只允许我向根对象提供参数,在这种情况下是Decorator<T>
,而不是它的任何依赖。