【发布时间】:2011-08-13 16:05:33
【问题描述】:
我不确定如何称呼这个父母/孩子,但你去吧,我有一个类似的案例:
namespace ConsoleApplication1
{
using System.Diagnostics;
using System.Linq;
using Castle.MicroKernel.Registration;
using Castle.MicroKernel.Resolvers.SpecializedResolvers;
using Castle.Windsor;
class Program
{
static void Main(string[] args)
{
var container = new WindsorContainer();
container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel));
container.Register(
Component.For<Parent>().LifeStyle.Singleton,
Component.For<IChild>().ImplementedBy<Child1>().LifeStyle.Singleton);
var p = container.Resolve<Parent>();
// Fails...
Debug.Assert(p.Children.First().Parent == p, "Parent should be resolved");
}
}
class Parent
{
public IChild[] Children { get; set; }
}
interface IChild
{
Parent Parent { get; set; }
}
class Child1 : IChild
{
public Parent Parent { get; set; }
}
}
我已将 CollectionResolver 添加到容器中。 Parent 和 Child1(带有 IChild 服务)都在容器中注册为单例。每当我尝试解析 Parent 实例时,我都会填充 Children 数组,但该数组中的 Child1 实例的 Parent 为 null。我期望的是 Child1 的 Parent 属性设置为我当时试图解决的 Parent 实例。我可以理解 Parent 还没有完全激活,但是由于它的 ctor 已经运行,Windsor 还不能注入这个属性吗?有什么方法可以完成这项工作,还是我应该手动运行一些代码来设置子对象的父母(这远非理想)?
提前致谢!
【问题讨论】:
标签: c# dependency-injection castle-windsor ioc-container circular-dependency