我正在尝试对已解析的组件执行操作,然后将其作为依赖项返回给应用程序。
例如,使用此图表:
public class Foo : IFoo { }
public class Bar {
IFoo _foo;
IBaz _baz;
public Bar(IFoo foo, IBaz baz) {
_foo = foo;
_baz = baz;
}
}
当我创建一个IFoo实例时,我希望容器实例化Bar并将已经解析的IFoo传递给它,以及它需要的任何其他依赖项。所以当我打电话时:
var foo = container.Resolve<IFoo>();
容器应自动调用:
container.Resolve<Bar>(); // should pass foo and instantiate IBaz
我尝试过使用OnCreate,DynamicParameters和UsingFactoryMethod,但它们共享的问题是它们没有对组件的显式引用: 在实例化IFoo之前调用DynamicParameters。 之后调用OnCreate,但委托不传递实例。 UsingFactoryMethod没有帮助,因为我需要使用TService和TComponent注册这些组件。
理想情况下,我希望注册看起来像这样:
container.Register<IFoo, Foo>((kernel, foo) => kernel.Resolve<Bar>(new { foo }));
请注意,IFoo和Bar使用瞬态生活方式注册,这意味着已经解析的实例必须传递给Bar - 它不能“重新解析”。
这可能吗?我错过了什么吗?
答案 0 :(得分:1)
看来这就是你想要的:
public interface IFoo {}
public class Foo : IFoo {}
public class Bar {
public IFoo BarFoo { get; private set;}
public Bar(IFoo foo) {
BarFoo = foo;
}
public void DoSomething() {
Console.WriteLine("Initializing");
}
}
[Test]
public void Create() {
var container = new WindsorContainer();
var initialized = false;
container.Register(Component.For<IFoo>().ImplementedBy<Foo>().LifeStyle.Transient
.OnCreate((kernel, foo) => {
var bar = kernel.Resolve<Bar>(new {foo});
Assert.AreSame(foo, bar.BarFoo);
bar.DoSomething();
initialized = true;
}));
container.Register(Component.For<Bar>().LifeStyle.Transient);
var f = container.Resolve<IFoo>();
Assert.IsTrue(initialized);
}
它实际上几乎与this other question重复。