Bağımlılık enjeksiyon çerçeveleri bir bağımlılık riski oluşturuyor mu?


13

Bağımlılık enjeksiyonunu kullanmak için mevcut bir sistemi yeniden düzenledim ve bu iş sorunsuz ilerliyor.

Bir süre sonra çok sayıda kurum içi kütüphanenin kullandığım DI çerçevesine bağımlı hale geldiğini fark ettim. Sonuç olarak, tüm proje şimdi bu üçüncü taraf çerçevesine dayanmaktadır.

Tüm bağımlılıkları ortak bir kütüphaneye bağımlı hale getirerek bir ironi gördüm.

İlk tepkim bağımlılık çerçevesi etrafında bir sarıcı kitaplığı oluşturmaktı. Bu nedenle, gerekirse bu çerçeveyi değiştirebilirim. İlgili çalışmayı tahmin ettikten sonra ortaya çıkan API'nin mevcut çerçeveye benzer olacağını fark ettim ve bu nedenle değiştirmeyi daha zor hale getireceğim. Bu yüzden fikri terk ettim.

Benim endişem, kullandığım DI çerçevesinin eski hale gelmesi veya değiştirilmesi gerekiyor.

DI ile çalışırken bir proje ile DI çerçevesi arasındaki bağlantıyı azaltan bir geliştirme modeli var mı?


4
"DI çerçevesi kullanma" kalıbı. Yine de gerçekten sahip olmadığınız bir sorunu çözüp çözmediğinizi merak etmeliyim - DI çerçevesini değiştirme olasılığınız nedir?
Oded

1
@ İyi bir DI çerçevesi şeffaf bir şekilde kodla çalışabilmelidir, ancak bunun mümkün olmadığı durumlar vardır. Daha sonra sınıflarınız içinde DI API'lerini kullanmanız gerekir. Bu durumlarda, DI çerçevesini bu sınıfları değiştirmeye gerek kalmadan paylaşmak veya değiştirmek zordur. Bu benim DI çerçevesiyle ilk defa çalıştığım için. Değiştirmem gerekip gerekmediğinden emin değilim.
Reactgular

8
Sisteminiz elektriğe de bağlıdır. Önce onu ayırmanızı öneririm.
Idan Arye

3
@MathewFoscarini Bu bir anti-desen değil mi? Bunu yapabilirsiniz, ancak bağımlılığı gizlediği için yapmamalısınız.
maaartinus

2
@ MathewFoscarini DIFramework.Get<IService>()aslında bağımlılık enjeksiyonu değildir; Servis Bulucu adlı ilişkili bir modeldir. Birçok kişi Servis Bulucu'dan hoşlanmaz, çünkü sizi çerçeveye bağlar ve çok kolay kötüye kullanılır (Singleton gibi). Martin Fowler'in
Benjamin Hodgson

Yanıtlar:


8

Tamamen haklısınız - bir DI çerçevesi kullanmak büyük olasılıkla kodunuzu o şeyden bağımlı kılacaktır. Aslında, bu çok şaşırtıcıdır, çünkü bu genellikle diğer tüm çerçeveler veya vakıf kütüphaneleri için geçerlidir, özellikle bu lib projenizi kodunuzun herhangi bir yerinde kullanılan bazı genel özelliklerle desteklediğinde. Örneğin, belirli bir kullanıcı arabirimi çerçevesini veya Web çerçevesini kullanmaya karar verdiğinizde, söz konusu kitaplığa dayalı olarak belirli miktarda kod oluşturduğunuzda bu kararın daha sonra değiştirilmesi zordur. Belirli (belki de standart dışı) bir Stringsınıf kullanmaya karar verdiğinizde , daha sonra bu kararı kolayca değiştiremezsiniz. Böyle bir karar mimari bir karardır, belirli bir programlama dilini seçmek gibidir ve> 100K kod satırı yazdıktan sonra bu kararı değiştirmeye çalışmaktır.

Kodunuzun tümünün belirli bir çerçeveye bağlı olması, ondan beklediğiniz şeyi yaptığı ve gerektiği gibi korunduğu sürece sorun olmayabilir. Ancak durum böyle değilse bir sorun haline gelebilir. Bu durumla nasıl başa çıkılacağı konusunda bazı stratejiler var:

  • birkaç yıl boyunca size güncellemeler ve yeni sürümler sunabileceğine inandığınız bir satıcıdan bir çerçeve seçin

  • yeterli sayıda kod satırı (ve uygun bir lisans) olan açık kaynaklı bir çerçeve seçin, böylece satıcı pazardan kaybolursa, kendi başınıza herhangi bir bakım yapabilirsiniz

  • kendi çerçeveni yaz

  • satıcı müsait olduğu sürece durumla yaşayın ve gerçekten yok olduğunda, farklı bir çerçeve seçin ve yeni çerçeveyi kullanarak eski çerçeveyi taklit eden bir adaptör oluşturmaya çalışın.

Önceden bir sarıcı kitaplığı oluşturma fikri hiç de yeni değil, ancak nadiren çalıştığını gördüm, çünkü gelecekteki bir durum için size çarpıp çarpmayacağını veya ne zaman çarpacağını ve ne yapacağını bilmediğiniz için varsayımlar yapmanız gerekecekti. "yeni" çerçeve gibi görünecek. Öte yandan, birkaç yıl önce, yukarıda bahsettiğim adaptör stratejisini uygulayarak ~ 120K kod satırı ile bir C ++ projesinde tam bir UI çerçevesini başarıyla değiştirdik.


19

Sıradan yapıcı enjeksiyonu hiç bir çerçeve gerektirmez. Kaybettiğiniz tek şey, bir yapılandırma dosyasındaki bağımlılıklarınızı merkezileştirme yeteneğidir.

DI kapları, nesne grafiği çok büyük ve karmaşık olduğunda kullanılan bir "kurumsal yazılım" kalıbıdır. Uygulamaların% 95'inin gerektirmediğinden şüpheleniyorum.


5
Ben küçük projeler olmadığını kabul edersiniz gerektiren bunu ancak projelerin 95 +% edebilir kar ondan.
maaartinus

11
@maaartinus: Minimum fayda için gereksiz karmaşıklık.
Robert Harvey

1
Nedir? Sınıf başına istatistiklerim: 0,5 açıklama, 0,1 yapılandırma satırı. Peki ne karmaşıklık demek istiyorsun ???
maaartinus

2
@RobertHarvey: Yukarıdaki ifadelere% 100 katılıyorum, ancak OP zaten bir DI çerçevesi başlattığını belirtiyor. Ona "daha iyi yapma" demek, sorunun cevabı değildir.
Doc Brown

1
@maaartinus daha çerçeve otomatikleştirir ve daha şeyler daha karmaşık enjekte edebilir. XML yapılandırma dosyaları, yapıcı enjeksiyon, özellik enjeksiyon, otomatik nesne alay, tembel enjeksiyon, vb .. vb .. Bu DI çerçeveleri çok karmaşık alabilirsiniz.
Reactgular

0

DI çerçevelerinin yakın zamanda gerçekten eski olabileceğini sanmıyorum. Eski yapmak için ne olmalı?

  • Yeni ve daha akıllı bir modelin icadı belki? Bununla birlikte, kodda çok daha büyük değişiklikler gerektirecektir.
  • Dilde bir değişiklik olabilir mi? Daha da kötüsü.

Mevcut DI'nin yeterince olgun olduğunu söyleyebilirim ve orada çok fazla şey olduğunun farkında değilim. Dilinizi belirtmediniz, bu yüzden Guice'den bahsetmişken , oldukça rahatsız edici değildir ve standart Java ek açıklamalarıyla çalışır (ayrıca standartlaştırılmamış şeyler için kendi dillerini kullanır, ancak nadiren buna ihtiyacınız vardır). Açık kaynaklı, yaygın olarak kullanılan ve Apache lisanslıdır. Sorun ne olabilir?

DI çerçevesinin değiştirilmesinin büyüklük sıralarının diğer kütüphaneleri değiştirmekten daha kolay olacağından eminim (örneğin, bir UI değişikliği çok daha fazla iş anlamına gelir).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.