Bu soru Unity Container hakkındadır ancak sanırım herhangi bir bağımlılık kabına uygulanabilir.Depresyon enjeksiyonu: kısmi başlatılmış nesneler enjekte etme
ben dairesel bağımlılıkları ile iki sınıf vardır:
class FirstClass
{
[Dependency]
public SecondClass Second { get; set; }
}
class SecondClass
{
public readonly FirstClass First;
public SecondClass(FirstClass first)
{
First = first;
}
}
Teknik singletons olarak ele eğer örneğini ve doğru olarak ikisi için de bağımlılıkları enjekte etmek mümkündür:
var firstObj = new FirstClass();
var secondObj = new SecondClass(firstObj);
firstObj.Second = secondObj;
ben yapmaya çalışacağım Birlik ile aynı, StackOverflowException alır:
Birliğin beni kısmen başlatılmış nesneleri kullanmamdan korumaya çalıştığını biliyorum ama bu korumayı bir zorunluluk değil bir seçenek olarak kullanmak istiyorum.
Soru: Mevcut davranış engelli mi?
ama elle yapabilirsiniz: Bu örnekte bir göz atın. Verdiğiniz MDSN bağlantısından, benim durumum için aşağıdakilerden hiçbiri doğru değil: - Yapıcı parametrelerinde birbirini referans alan yapıcı enjeksiyonuyla oluşturulan nesneler - Bir sınıf örneğinin iletildiği, yapıcı enjeksiyonu yoluyla oluşturulan nesneler kendi kurucusuna parametre - Birbirine referans veren yöntem çağrısı enjeksiyonu yoluyla oluşturulan OO'lar - Birbirine referans veren özellik (ayarlayıcı) enjeksiyonuyla oluşturulan OO'lar –
Sorun, birkaç saniyede "FirstClass" bağımlılık nesnesi olmadan yaşar. bu gerçekten geçerli olmadığı anlamına gelir. Bütün bunlar temel olarak, nesnelerin inşa edildiğinde ne yaptığına bağlıdır, eğer ikinci sınıfınız, ilk nesneyi çağırmaya çalışırsa, ilk olanın bağımlı nesneyi kullanılabilir olmasını beklerse, o zaman başarısız olur. Bunun gibi dairesel zincirler çeşitli nedenlerden dolayı sorunludur, bu yüzden mümkünse kaçınmaya çalışmalısınız. –
Özellikle nesnelerimi elle oluşturabildiğim hesaba katılarak StackOverflowException yerine NRE almayı tercih ederim. –