Autofac 仅在使用键控属性时报告循环依赖关系

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

我试图将特定的键控对象注入另一个构造函数中,但 autofac 8.0.0 引发了一个异常,即存在循环依赖项:检测到循环组件依赖项:DummyComboMotor -> DummyComboMotor -> DummyComboMotor。

这是重现问题的代码。我没有看到这里的循环,所以我假设我不理解 autofac 的设计。有什么想法吗?


using Autofac;
using Autofac.Features.AttributeFilters;

public interface IMotorInterface { }

public class DummyXMotor : IMotorInterface { }

public class DummyComboMotor : IMotorInterface
{
    public DummyComboMotor([KeyFilter("XMotor")] IMotorInterface x) {}
}


class TestClass
{
    static void Main(string[] args)
    {
        var builder = new ContainerBuilder();
        builder.RegisterType(typeof(DummyXMotor))
            .As(typeof(DummyXMotor))
            .As(typeof(IMotorInterface))
            .Keyed("XMotor", typeof(IMotorInterface));
        builder.RegisterType(typeof(DummyComboMotor))
            .As(typeof(DummyComboMotor))
            .As(typeof(IMotorInterface))
            .Keyed("ComboMotor", typeof(IMotorInterface));
        var container = builder.Build();
        var combo = container.Resolve<DummyComboMotor>();
    }
}
c# autofac
1个回答
0
投票

如文档 Resolving with Attributes on Named and Keyed Services 中所示,您必须使用

WithAttributeFiltering()
扩展方法 来指示应使用属性过滤:

当您注册需要属性过滤的组件时,您需要确保选择加入。查询属性并进行过滤会产生较小但非零的性能影响,因此它不会自动发生。

所以你的

DummyComboMotor
课程的注册应该如下:

builder.RegisterType(typeof(DummyComboMotor))
    .As(typeof(DummyComboMotor))
    .As(typeof(IMotorInterface))
    .Keyed("ComboMotor", typeof(IMotorInterface))
    .WithAttributeFiltering();
© www.soinside.com 2019 - 2024. All rights reserved.