Ich benutze Castle Windsor 2.5.1 in einem ASP.NET MVC-Projekt und mit Property-Injektion ein Objekt erstellen, die ich immer auf einer Basis-Controller-Klasse zur Verfügung stehen. Ich benutze eine Fabrik, um dieses Objekt zu erstellen, aber wenn es einen Fehler im Konstruktor gibt, bekomme ich von Windsor überhaupt keine Warnung und es gibt nur mein Objekt zurück, ohne die Eigenschaft zu injizieren.Castle Windsor seltsames Verhalten wth Property-Injektion und Factory-Methode
Ist dies das erwartete Verhalten, und wenn ja, wie bekomme ich einen Fehler, wenn eine Fabrik nichts zurückgibt? Hier
ist ein Beispiel
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!
}
}
Eine interessante Beobachtung, wenn ich dies in meiner MVC-Anwendung verwenden, erhalte ich einen internen Fehler von Windsor, wenn ReleaseComponent
Aufruf - so auch wenn es nicht mir gab zurück Klasse mit meiner Abhängigkeit injiziert, scheint es immer noch zu versuchen, es zu veröffentlichen.
Danke, die Antwort ist genau richtig! Ich kann das auf verschiedene Arten umgehen, also ist das kein Problem – amarsuperstar
Hier ist ein Weg um dies: http://StackOverflow.com/a/12007547/114029 –