2010-01-03 26 views
46

Daha büyük bir projede IoC ilkelerini kullanmaya karar verdim. Ancak, uzun zamandır beni rahatsız eden düz bir şey almak istiyorum. Benim ortaya koyduğum sonuç, bir IoC konteynerinin bir tasarım deseni değil, mimari bir model olması. Başka bir deyişle, hiçbir sınıf kendi varlığından haberdar olmamalıdır ve tüm bileşenleri dikmek için uygulama katmanında kapın kendisi kullanılmalıdır. Esasen, iyi tasarlanmış bir nesne yönelimli modelin üzerinde bir seçenek haline gelir. Bunu söyledikten sonra, IoC konteynerleri her yere serpilmeden (soyutlanıp çizilmediğine bakılmaksızın) çözümlenmiş türlere nasıl erişilebileceği belirtildi mi? Burada gördüğüm tek seçenek, beton tiplerini çözmek için IoC konteynerini kullanan soyut fabrikaları kullanmaktır. Bu, bir dizi standart fabrika için değiş tokuş etmek için yeterince kolay olmalıdır. Bu iyi bir yaklaşım mı? Burada kimse var ve sizin için ne kadar iyi çalıştı? Başka bir şey var mı?IoC üstüne soyut fabrika düzeni?

Teşekkürler!

cevap

69

, Bağımlılık Enjeksiyon (DI) kendisi desen ve teknikleri sadece topluluğudur.

Uygulamanın kökünde tüm gerekli nesne grafiklerini oluşturuyoruz. (Poor Man DI) Burası Kompozisyon Kök denir ve bizim için bu kablolama yapmak için bir DI Kapsayıcı kullanabilir veya manuel yapabiliriz.

nokta teknolojisinin belirli bir parçasının (sizin DI Konteyner) için güçlü bir gönderme var uygulamanızda tek bir yer olmasıdır. Uygulamanın kalanı nesne grafiği yukarı kablolu nasılblissfully habersiz - önemli olan gerekli tüm bağımlılıkları doğru enjekte edildi (ve bu yüzden olduğunu garanti etmek Boş Muhafız ile Yapıcı Enjeksiyon kullanabilirsiniz olmasıdır). o DI geldiğinde

Özet Fabrika desen bir çok kullanışlı kalıptır. Özette, şu durumlarda Özet Fabrikasını kullanın:

  • Bir bağımlılığı çözmeden önce yalnızca çalışma zamanında bilinen bir veya daha fazla parametre sağlamanız gerekir.
  • Bağımlılığın ömrü, tüketicinin yaşam süresinden kavramsal olarak daha kısadır.

örnekleri ve daha fazla bilgi burada mevcuttur:

+1

Sanırım neredeyse oradayım. Burada benimle kal :) Diyelim ki sınıf Apple tarafından uygulanan IFruit arayüzüne sahibim. Bu beton türünü kaydettikten sonra, bir Windows Formunda düğme tıklama olayımda kullanmak istiyorum. Düğme olayından IoC konteynerine açıkça erişmeden nasıl sınıf Apple'a ulaşabilirim? –

+7

Bu, uygulamanıza göre birçok IFruit örneği var mı? Eğer sadece bir tane varsa, düğmeye tıklama işleyicisi ile daha önceden sınıfa enjekte edilmelidir. Çok fazla varsa, büyük olasılıkla diğer çalışma zamanı değerlerinden bir IFruit örneği oluşturabilen bir IFruitFactory'ye ihtiyacınız olacaktır. İkinci durumda, IFruitFactory enjekte bağımlılık olacaktır. –

+0

Yalnızca bir IFruit örneğinin varlığını göz önünde bulundurarak, düğme sınıfı olayıyla Form sınıfına enjekte edildiğini görebilmemin tek yolu, IFruit arabirimini içerecek şekilde form yapıcısını değiştirirsem ve sonra kurucuyu gerçekleştirmek için Formu kendisinin IoC konteynerine kaydettirmekti enjeksiyon. Bu doğru mu? Yardımın için teşekkürler! –

4

Eh uygulamanın en üst kısmında Eğer IOC bağlamı yükleyen bir Bootstrap sınıfını gerekir. Bu bağlamda, daha sonra gerçeklenmiş nesneler sağlanacak ve bu nedenle bir fabrika olarak işlev görecektir.

Ama bu sadece mümkün olduğunca altta yatan mimari hakkında az bilmeli çok az nesneler ve Bootstrap/Fabrika sınıfının kullanıcı ile gerçekleşmesi gerekir. Örneğin, bir HTTP sunucu nesnesini tamamen IOC aracılığıyla yapılandırdıysanız ve bunu başlatmak istiyorsanız, Bootstrap sınıfınız sadece bir getHttpServer() yöntemi sağlamalıdır. Ardından, programlarınızın ana yönteminin yalnızca çalışmasını sağlamak için Bootstrap.getHttpServer(). Start() öğesini çağırması gerekir.

diğer nesnelerin kablo önceden uygulama bağlamında ile yapılmıştır, örneğin Object B'yi Object B'nin bir parçası olan IOC aracılığıyla yapılandırırsınız, böylece Object B'ye A Nesnesi referansı ile konfigüre edilirsiniz. Bunların hiçbiri genellikle ne konteyner ne de fabrika hakkında bilgi sahibi olmaz. Zaten anladım gibi