मैं अपने कोड में कुछ पहुंच योग्यता सामग्री को साफ करने की कोशिश कर रहा था, और अनजाने में एकता निर्भरता इंजेक्शन तोड़ दिया। थोड़ी देर के बाद मुझे एहसास हुआ कि मैंने कुछ सार्वजनिक गुणों को चिह्नित किया है कि मैं वास्तव में अपने डीएलएल के बाहर आंतरिक रूप से खुलासा नहीं करना चाहता था। तब मैंने अपवाद प्राप्त करना शुरू कर दिया।यूनिटी फ्रेमवर्क निर्भरता एट्रिब्यूट केवल सार्वजनिक संपत्तियों के लिए काम करता है?
तो ऐसा लगता है कि एकता में [निर्भरता] विशेषता का उपयोग केवल सार्वजनिक गुणों के लिए काम करता है। मुझे लगता है कि आंतरिक और निजी प्रोप एकता असेंबली के लिए दृश्यमान नहीं होंगे, लेकिन वास्तव में गंदे लगता है कि कभी भी किसी को भी सेट करने या सक्षम करने में सक्षम होना चाहिए, एकता के अलावा ।
क्या एकता को आंतरिक या निजी संपत्तियों को सेट करने का कोई तरीका है?
यहां यूनिट परीक्षण है जिसे मैं पास देखना चाहता हूं। वर्तमान में केवल सार्वजनिक प्रोप परीक्षण में सफ़ल:
[TestFixture]
public class UnityFixture
{
[Test]
public void UnityCanSetPublicDependency()
{
UnityContainer container = new UnityContainer();
container.RegisterType<HasPublicDep, HasPublicDep>();
container.RegisterType<TheDep, TheDep>();
var i = container.Resolve<HasPublicDep>();
Assert.IsNotNull(i);
Assert.IsNotNull(i.dep);
}
[Test]
public void UnityCanSetInternalDependency()
{
UnityContainer container = new UnityContainer();
container.RegisterType<HasInternalDep, HasInternalDep>();
container.RegisterType<TheDep, TheDep>();
var i = container.Resolve<HasInternalDep>();
Assert.IsNotNull(i);
Assert.IsNotNull(i.dep);
}
[Test]
public void UnityCanSetPrivateDependency()
{
UnityContainer container = new UnityContainer();
container.RegisterType<HasPrivateDep, HasPrivateDep>();
container.RegisterType<TheDep, TheDep>();
var i = container.Resolve<HasPrivateDep>();
Assert.IsNotNull(i);
Assert.IsNotNull(i.depExposed);
}
}
public class HasPublicDep
{
[Dependency]
public TheDep dep { get; set; }
}
public class HasInternalDep
{
[Dependency]
internal TheDep dep { get; set; }
}
public class HasPrivateDep
{
[Dependency]
private TheDep dep { get; set; }
public TheDep depExposed
{
get { return this.dep; }
}
}
public class TheDep
{
}
अपडेट किया गया:
मैं कॉल स्टैक देखा संपत्ति से पारित कर दिया स्थापित करने के लिए: तो की कोशिश में
UnityCanSetPublicDependency()
--> Microsoft.Practices.Unity.dll
--> Microsoft.Practices.ObjectBuilder2.dll
--> HasPublicDep.TheDep.set()
लिए कम से कम आंतरिक संस्करण काम करते हैं, मैंने इन्हें अपनी असेंबली के गुणों में जोड़ा:
[assembly: InternalsVisibleTo("Microsoft.Practices.Unity")]
[assembly: InternalsVisibleTo("Microsoft.Practices.Unity.Configuration")]
[assembly: InternalsVisibleTo("Microsoft.Practices.ObjectBuilder2")]
हालांकि, कोई बदलाव नहीं। एकता/ऑब्जेक्टबिल्डर अभी भी आंतरिक संपत्ति सेट नहीं करेगा
कस्टम एक्सटेंशन बनाकर एक समाधान मिला। नीचे मेरा जवाब देखें ... – CodingWithSpike