我正在遍历树的深度优先,我想为每个级别创建一个新的子容器,其中一些值只能从一个级别下来解析。我们有这个设置代码:
class Processor<T> {
public T Item { get; set; }
}
class SomeProcessor: Processor<Thing> { }
class OtherProcessor: Processor<Blah> { }
var container = new WindsorContainer();
container.Register(Component.For<Processor<Thing>>().ImplementedBy<SomeProcessor>().LifestyleTransient());
container.Register(Component.For<Processor<Blah>>().ImplementedBy<OtherProcessor>().LifestyleTransient());
然后我用这种方法遍历任何对象的树:
void Process(Type type, object item, IWindsorContainer container) {
using(var childContainer = new WindsorContainer()) {
container.AddChildContainer(childContainer);
childContainer.Register(Component.For(type).Instance(item));
var resolved = childContainer.Resolve(typeof(Processor<>).MakeGenericType(type));
//eventually:
foreach(var subItem in otherItemsUnderCurrentItem) {
Process(subItem.GetType(), subItem, childContainer);
}
container.RemoveChildContainer(childContainer);
}
}
如果需要将类型作为构造函数,则表明组件具有无法满足的依赖性。如果它只是一个参数,则它为空。
如果我只是更改为container.Register(Component.Form(type).Instance(item));
一切都正确解析 - 不同之处在于我将其注册在父容器而不是我正在解析的容器上。
这是该框架的正确方法吗?