在 Autofac 中将 ObservableCollection 注册为 self 和 IEnumerable<> 会导致循环依赖异常

Registering ObservableCollection as self and as IEnumerable<> in Autofac causes circular dependency exception

我希望相同的集合有时显示为 IEnumerable<T>,有时显示为 ObservableCollection<T>,但我收到 Autofac 错误:

Circular component dependency detected

这是我的代码:

var builder = new ContainerBuilder();

builder.RegisterType<ObservableCollection<Foo>>()
       .InstancePerLifetimeScope()
       .AsSelf()
       .As<IEnumerable<Foo>>();

using (var containter = builder.Build())
{
    var foos = containter.Resolve<ObservableCollection<Foo>>();
}

Autofac 尝试使用 ObservableCollection<T> 的构造函数,该构造函数采用 IEnumerable<T> 类型的参数,这就是为什么你有循环依赖异常。

要解决此问题,您可以使用以下代码:

builder.Register(c => new ObservableCollection<IFoo>())
       .InstancePerLifetimeScope()
       .AsSelf()
       .As<IEnumerable<IFoo>>();

builder.RegisterType<ObservableCollection<Foo>>()
       .FindConstructorsWith(t => new[] { t.GetConstructor(Type.EmptyTypes) })
       .InstancePerLifetimeScope()
       .AsSelf()
       .As<IEnumerable<Foo>>();