मैं एएसपी.नेट एमवीसी प्रोजेक्ट में कैसल विंडसर 2.5.1 का उपयोग कर रहा हूं और एक ऑब्जेक्ट बनाने के लिए प्रॉपर्टी इंजेक्शन का उपयोग कर रहा हूं जिसे मैं बेस नियंत्रक वर्ग पर हमेशा उपलब्ध होने की उम्मीद करता हूं। मैं इस ऑब्जेक्ट को बनाने के लिए एक फैक्ट्री का उपयोग कर रहा हूं, हालांकि अगर कन्स्ट्रक्टर में कोई त्रुटि है, तो मुझे विंडसर से चेतावनी नहीं मिलती है और यह सिर्फ मेरी ऑब्जेक्ट देता है लेकिन संपत्ति इंजेक्शन के बिना।कैसल विंडसर अजीब व्यवहार wth संपत्ति इंजेक्शन और फैक्टरी विधि
क्या यह अपेक्षित व्यवहार है, और यदि हां, तो कोई कारखाना कुछ भी वापस करने में विफल होने पर मुझे कोई त्रुटि कैसे प्राप्त हो सकती है?
यहाँ एक उदाहरण
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
यहां यह एक तरीका है: http://stackoverflow.com/a/12007547/114029 –