Bu sorunun eski olduğunu biliyorum ama beş sentimi eklemek istiyorum,
Bağımlılık enjeksiyonunun (DI) yapılandırılabilir bir Fabrika Deseni (FP) gibi birçok açıdan olduğunu düşünüyorum ve bu anlamda DI ile yapabileceğiniz her şeyi böyle bir fabrika ile yapabileceksiniz.
Aslında, örneğin yay kullanıyorsanız, otomatik kablolama kaynakları (DI) veya bunun gibi bir şey yapma seçeneğiniz vardır:
MyBean mb = ctx.getBean("myBean");
Ve sonra bir şey yapmak için o 'mb' örneğini kullanın. Bu size bir örnek verecek bir fabrikaya çağrı değil mi ??
FP örneklerinin çoğu arasında fark ettiğim tek gerçek fark, "myBean" ın bir xml'de veya başka bir sınıfta ne olduğunu yapılandırabilmenizdir ve bir çerçeve fabrika olarak çalışır, ancak bunun dışında aynı şeydir ve kesinlikle bir config dosyasını okuyan veya gerektiğinde uygulamayı alan bir Fabrikaya sahip olabilir.
Ve bana fikrimi sorarsan (Ve bilmediğini biliyorum), DI'nin aynı şeyi yaptığını ama sadece gelişime daha fazla karmaşıklık kattığına inanıyorum, neden?
iyi, bir şey için, DI ile otomatik olarak bağladığınız herhangi bir fasulye için uygulamanın ne olduğunu bilmeniz için, yapılandırmanın kendisine gitmelisiniz.
ama ... ya kullandığınız nesnenin uygulanmasını bilmek zorunda kalmayacağınız vaadine ne dersiniz? pfft! ciddi anlamda? böyle bir yaklaşım kullandığınızda ... uygulamayı yazan ile aynı değil misiniz ?? ve yapmasanız bile, neredeyse her zaman uygulamanın nasıl yapması gerektiğini nasıl yaptığına bakarak öyle değil mi ??
ve son bir kere, bir DI çerçeve vaat ne kadar önemli değil sen şeyler inşa edeceğini size ayrılmış size her şeyi inşa bir çerçeve kullanıyorsanız, kendi sınıfları için hiçbir bağımlılıkları ile, ondan, onu aroud size varsa yaklaşımı veya çerçeveyi değiştirmek kolay bir iş olmayacak ... HİÇ! ... ancak, işiniz için en iyi çözümden endişe etmek yerine, her şeyi belirli bir çerçevede oluşturduğunuzdan, bunu yaparken bir biiig proben ile karşılaşacaksınız.
Aslında, görebildiğim bir FP veya DI yaklaşımı için tek gerçek iş uygulaması, çalışma zamanında kullanılan uygulamaları değiştirmeniz gerekiyorsa , ancak en azından bildiğim çerçeveler bunu yapmanıza izin vermiyorsa, ayrılmanız gerekiyor geliştirme zamanında yapılandırma her şey mükemmel bir başka bir yaklaşım kullanmak gerekiyorsa.
Yani, aynı uygulamada iki kapsamda farklı performans gösteren bir sınıfım varsa (diyelim ki, bir holdingin iki şirketi), iki farklı fasulye oluşturmak için çerçeveyi yapılandırmam ve her birini kullanmak için kodumu uyarlamam gerekiyor. Ben sadece böyle bir şey yazar gibi değil mi:
MyBean mb = MyBeanForEntreprise1(); //In the classes of the first enterprise
MyBean mb = MyBeanForEntreprise2(); //In the classes of the second enterprise
bununla aynı:
@Autowired MyBean mbForEnterprise1; //In the classes of the first enterprise
@Autowired MyBean mbForEnterprise2; //In the classes of the second enterprise
Ve bu:
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise1"); //In the classes of the first enterprise
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise2"); //In the classes of the second enterprise
Her durumda, ister sınıf ister yapılandırma dosyaları olsun, uygulamanızdaki bir şeyi değiştirmeniz gerekecektir, ancak bunu yeniden konuşlandırmanız gerekecektir.
Böyle bir şey yapmak hoş olmaz mıydı:
MyBean mb = (MyBean)MyFactory.get("mb");
Ve bu şekilde, fabrika kodunu kayıtlı kullanıcı kuruluşuna bağlı olarak çalışma zamanında doğru uygulamayı almak için ayarladınız ?? Şimdi bu yardımcı olur. Yeni sınıflarla yeni bir kavanoz ekleyebilir ve kuralları çalışma zamanında bile ayarlayabilir (veya bu seçeneği açık bırakırsanız yeni bir yapılandırma dosyası ekleyebilirsiniz), mevcut sınıflarda değişiklik olmaz. Bu Dinamik bir fabrika olurdu!
her işletme için iki konfigürasyon yazmak zorunda olmaktan ve hatta her biri için iki farklı uygulamaya sahip olmaktan daha yararlı olmaz mı?
Bana söyleyebilirsin, anahtarı çalışma zamanında hiç yapmam gerekmiyor, bu yüzden uygulamayı yapılandırıyorum ve sınıfı devralırsam veya başka bir uygulama kullanırsam, sadece yapılandırmayı değiştirir ve yeniden konuşlandırırım. Tamam, bu bir fabrika ile de yapılabilir. Ve dürüst ol, bunu kaç kez yapıyorsun? belki sadece şirketinizde başka bir yerde kullanılacak bir uygulamanız olduğunda ve kodu başka bir ekibe geçirdiğinizde ve bunun gibi şeyler yaparlar. Ama hey, bu fabrika ile de yapılabilir ve dinamik bir fabrika ile daha da iyi olurdu!
Her neyse, yorum bölümü beni öldürmen için açıksa.