如何解决如何使用Autofac 2.4.5处理循环引用?
| 关于循环引用的autofac Wiki页面说使用:cb.Register<DependsByProp>().OnActivated(ActivatedHandler.InjectUnsetProperties);
但是看来2.4.5中不再存在ActivatedHandler。深入研究源代码,我发现了该类的实现,因此我将方法实现放在OnActivated中。不幸的是,这仍然行不通。
我在这里整理了一个最小化的副本,看起来像Wiki页面上的内容。
class M
{
public VM VM { get; set; }
public M()
{
}
}
class VM
{
public VM(M m)
{
}
}
[Fact]
void CanResolveCircular()
{
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterType<VM>();
builder.RegisterType<M>().OnActivated(e => e.Context.InjectUnsetProperties(e.Instance));
using (var container = builder.Build())
{
var m = container.Resolve<M>();
Assert.NotNull(m);
}
}
尝试解析时,此代码仍会引发堆栈溢出异常。我想念什么?使Autofac处理循环依赖关系的正确方法是什么?
解决方法
有关循环依赖项的Autofac文档指出:
请注意,设置没有任何意义
如果两个类都是这种情况
在工厂范围内注册。
您的
M
和VM
注册都为InstancePerDependency
(以前称为FactoryScope
),因此此声明适用于您的情况。结果,您陷入了创建M和VM实例的无穷循环。
如果希望注入的属性VM
采取与您解析的M
相同的实例,则应将M
的生存期更改为InstancePerDependency
以外的其他值(例如SingleInstance
)。如下所示:
builder.RegisterType<M>().PropertiesAutowired(true).SingleInstance();
注意:我还使用了更新的PropertiesAutowired(true)扩展方法。您可以使用它代替repro中的OnActivated代码。
如果您不希望每个应用程序有一个2英镑的实例,则可以设置一个13英镑并使用14英镑。
, 对于任何对此感兴趣的人都是执行此操作的新方法:
class DependsByProp1
{
public DependsByProp2 Dependency { get; set; }
}
class DependsByProp2
{
public DependsByProp1 Dependency { get; set; }
}
// ...
var cb = new ContainerBuilder();
cb.RegisterType<DependsByProp1>()
.InstancePerLifetimeScope()
.PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);
cb.RegisterType<DependsByProp2>()
.InstancePerLifetimeScope()
.PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);
财产/财产依赖性
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。