Castle Windsor:在OnCreate,UsingFactoryMethod或DynamicParameters中重用已解析的组件

时间:2010-04-30 19:30:21

标签: castle-windsor ioc-container

我正在尝试对已解析的组件执行操作,然后将其作为依赖项返回给应用程序。

例如,使用此图表:

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 - 它不能“重新解析”。

这可能吗?我错过了什么吗?

1 个答案:

答案 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重复。