我试图在一个已解析的组件作为依赖项返回给应用程序之前,对它执行一个操作。
例如,使用下面的图表:
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,但它们都有一个共同的问题,那就是它们都没有显式地引用组件: DynamicParameters是在IFoo实例化之前调用的。之后调用OnCreate,但委托不传递实例。UsingFactoryMethod没有帮助,因为我需要向TService和TComponent注册这些组件。
理想情况下,我希望注册是这样的:
container.Register<IFoo, Foo>((kernel, foo) => kernel.Resolve<Bar>(new { foo }));请注意,IFoo和Bar是以瞬态生命方式注册的,这意味着已经解析的实例必须传递给Bar -它不能被“重新解析”。
这个是可能的吗?我是不是遗漏了什么?
发布于 2010-05-01 10:29:52
看起来这就是你想要的:
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的复制品。
https://stackoverflow.com/questions/2747117
复制相似问题