Estoy usando Castle Windsor 2.5.1 en un proyecto ASP.NET MVC y uso de inyección de propiedad para crear un objeto que espero siempre esté disponible en una clase de controlador base. Estoy usando una fábrica para crear este objeto, sin embargo, si hay un error en el constructor, no recibo ninguna advertencia de Windsor y simplemente devuelve mi objeto pero sin inyectar la propiedad.Castle Windsor comportamiento extraño con inyección de propiedad y método de fábrica
¿Es este el comportamiento esperado, y si es así, cómo puedo obtener un error cuando una fábrica no devuelve nada?
Aquí es un ejemplo
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!
}
}
Una observación interesante, si uso esto en mi aplicación MVC, me sale un error interno de Windsor al llamar ReleaseComponent
- así que, aunque no me dio vuelta una clase con mi dependencia inyectada, todavía parece intentar liberarlo.
¡Gracias, la respuesta es perfecta! Puedo solucionar esto de varias maneras, así que no hay problema – amarsuperstar
Aquí hay una forma de evitar esto: http://stackoverflow.com/a/12007547/114029 –