我在ASP.NET MVC項目中使用Castle Windsor 2.5.1,並使用屬性注入來創建一個對象,我希望這個對象始終在基礎控制器類上可用。我使用工廠來創建這個對象,但是如果在構造函數中有錯誤,我根本沒有從Windsor得到警告,它只是返回我的對象,但沒有注入屬性。Castle 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應用程序,我打電話ReleaseComponent
時得到溫莎內部錯誤 - 所以即使它沒有給我回類與我的依賴注入,它仍然似乎嘗試釋放它。
謝謝,答案是現貨!我可以通過幾種方法解決這個問題,所以這不是問題 – amarsuperstar 2010-12-09 18:51:24
這是一個解決方法:http://stackoverflow.com/a/12007547/114029 – 2014-01-08 21:19:53