作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑需要创建一些递归嵌套的东西的情况,例如:
public interface IRecurrentTestNodeFactory
{
RecurrentTestNode Create(int num);
}
public class RecurrentTestNode
{
public int Num { get; set; }
public RecurrentTestNode Child { get; set; }
public RecurrentTestNode(int num, IRecurrentTestNodeFactory factory)
{
Num = num;
Child = num > 0 ? factory.Create(num - 1) : null;
}
}
明显的实现是这样的:
public class ManualRecurrentTestNodeFactory : IRecurrentTestNodeFactory
{
public RecurrentTestNode Create(int num)
{
return new RecurrentTestNode(num, this);
}
}
[Test]
public void ManualRecurrentTest()
{
var root = new ManualRecurrentTestNodeFactory().Create(1);
Assert.NotNull(root);
Assert.AreEqual(1, root.Num);
Assert.NotNull(root.Child);
Assert.AreEqual(0, root.Child.Num);
Assert.Null(root.Child.Child);
}
这个测试通过了。但是,如果您尝试对 Windsor 的类型化工厂设施做同样的事情:
[Test]
public void RecurrentTest()
{
var windsor = new WindsorContainer();
windsor.Kernel.AddFacility<TypedFactoryFacility>();
windsor.Register(Component.For<IRecurrentTestNodeFactory>().AsFactory());
windsor.Register(Component.For<RecurrentTestNode>().LifeStyle.Transient);
var f = windsor.Resolve<IRecurrentTestNodeFactory>();
var root = f.Create(1);
Assert.NotNull(root);
Assert.AreEqual(1, root.Num);
Assert.NotNull(root.Child);
Assert.AreEqual(0, root.Child.Num);
Assert.Null(root.Child.Child);
}
失败并出现以下异常:
Castle.MicroKernel.ComponentActivator.ComponentActivatorException : ComponentActivator: could not instantiate Tests.RecurrentTestNode
----> System.Reflection.TargetInvocationException : Exception has been thrown by the target of an invocation.
----> Castle.MicroKernel.CircularDependencyException : Dependency cycle has been detected when trying to resolve component 'Tests.RecurrentTestNode'.
The resolution tree that resulted in the cycle is the following:
Component 'Tests.RecurrentTestNode' resolved as dependency of
component 'Tests.RecurrentTestNode' which is the root component being resolved.
很明显为什么这样的代码在服务的情况下会失败,但对于工厂来说似乎没有必要限制。我想留在工厂变体中,因为我在那里有一堆容器解析的依赖项,而不是普通的 int。
最佳答案
懒惰地打破循环,而不是在构造函数中。温莎的行为是正确的。
关于c# - 创建递归嵌套实体的类型化工厂设施,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12566162/
我是一名优秀的程序员,十分优秀!