我试图将特定的键控对象注入另一个构造函数中,但 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>();
}
}
如文档 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();