ASP.NETMVCプロジェクトでCastleWindsor2.5.1を使用しており、プロパティインジェクションを使用して、ベースコントローラークラスで常に使用できると予想されるオブジェクトを作成しています。ファクトリを使用してこのオブジェクトを作成していますが、コンストラクターでエラーが発生した場合、Windsorからの警告はまったく表示されず、プロパティを挿入せずにオブジェクトが返されるだけです。
これは予想される動作ですか?もしそうなら、ファクトリが何も返さないときにエラーを発生させるにはどうすればよいですか?
これが例です
public class MyDependency : IMyDependency
{
public MyDependency(bool error)
{
if (error) throw new Exception("I error on creation");
}
}
public interface IMyDependency
{
}
public class MyConsumer
{
public IMyDependency MyDependency { get; set; }
}
[TestFixture]
public class ProgramTest
{
[Test]
public void CreateWithoutError() //Works as expected
{
var container = new WindsorContainer().Register(
Component.For<IMyDependency>().UsingFactoryMethod(() => new MyDependency(false)).LifeStyle.Transient,
Component.For<MyConsumer>().LifeStyle.Transient
);
var consumer = container.Resolve<MyConsumer>();
Assert.IsNotNull(consumer);
Assert.IsNotNull(consumer.MyDependency);
}
[Test]
public void CreateWithError_WhatShouldHappen() //I would expect an error since it can't create MyDependency
{
var container = new WindsorContainer().Register(
Component.For<IMyDependency>().UsingFactoryMethod(() => new MyDependency(true)).LifeStyle.Transient,
Component.For<MyConsumer>().LifeStyle.Transient
);
Assert.Throws<Exception>(() => container.Resolve<MyConsumer>());
}
[Test]
public void CreateWithError_WhatActuallyHappens() //Gives me back a consumer, but ignores MyDependency
{
var container = new WindsorContainer().Register(
Component.For<IMyDependency>().UsingFactoryMethod(() => new MyDependency(true)).LifeStyle.Transient,
Component.For<MyConsumer>().LifeStyle.Transient
);
var consumer = container.Resolve<MyConsumer>();
Assert.IsNotNull(consumer);
Assert.IsNull(consumer.MyDependency); //Basically fails silently!
}
}
興味深いことに、MVCアプリケーションでこれを使用すると、呼び出し時にWindsorから内部エラーが発生します。ReleaseComponent
したがって、依存性が注入されたクラスが返されなかったとしても、解放しようとしているように見えます。