2009-09-17 23 views
10

ile çalışma zamanı bağımlılığı enjeksiyonu Şu anki projem ilkbahardan yararlanıyor ve mimarımız, Spring'in Hizmetler, Depolar ve Fabrika nesnelerini yönetmesine izin vermiyor, ancak etki alanı nesneleri DEĞİL. Alan adı verilen tasarımı yakından takip ediyoruz. Etki alanı nesneleri için yay kullanmamanın ardındaki sebep, öncelikle ilkbaharın yalnızca statik bağımlılık enjeksiyonuna izin vermesidir. Statik bağımlılık enjeksiyonu ile kastettiğim şey, bağımlılıkların xml yapılandırmasında belirtilmesi ve "donmuş" hale getirilmesidir.İlkbahar

Belki de yanılıyor olabilirim, ancak şu andaki anlayışım, etki alanımın yalnızca nesnelerle iletişim kurmak için arabirimleri kullanmasına rağmen, ilkbaharın xml yapılandırması beni somut bir bağımlılık belirtmeye zorluyor. Bu nedenle, tüm somut bağımlılıkların dağıtım zamanında çözülmesi gerekmektedir. Bazen bu mümkün değildir. Usecas'larımızın çoğu, çalışma zamanı verilerine veya bir son kullanıcıdan alınan bir mesaja dayalı olarak belirli bir türün enjekte edilmesine dayanmaktadır.

Tasarımlarımızın çoğu komut desenini takip ediyor. Bu nedenle, bir komutu aldığımızda, alan modelimizi oluşturmak ve bir komuttan alınan verilere dayanarak, belirli bir dizi kümeyi bir araya getirilen kök nesnesine enjekte ediyoruz. Bu nedenle, yayın çalışma zamanı verilerine dayanan bir etki alanı modeli oluşturma yeteneğinin eksikliğinden dolayı, statik fabrika yöntemleri, inşaatçılar ve Fabrika kalıpları kullanmak zorunda kalıyoruz.

İlkbahar, yukarıdaki senaryoda bir sorun varsa, lütfen birisini bilgilendirebilir misiniz?

AOP'yi bağımlılıkları enjekte etmek için kullanabilirdim, ancak baharın altyapısını kullanmıyorum.

cevap

2

Spring'in bağımlılık enjeksiyonu (ve genel olarak bağımlılık enjeksiyonu) temel olarak Hizmetler, Depolar ve Fabrikalar vb. Için kablolama içindir. Bu, komutlara vb. Yanıt olarak dinamik olarak yapılması gereken şeyleri doğrudan işlemek zorunda değildir. etki alanı nesneleriyle çoğu şey. Bunun yerine, bunları yapmak için kullanmak istediğiniz nesnelere kablo bağlamanıza izin vererek, bu şeylerin nasıl yapıldığı konusunda kontrol sağlar.

+2

Bu yay biraz kısa satıyor. Bu şeyleri yapabilir, sadece biraz daha fazla çaba gerektirir. – skaffman

10

Using AspectJ to dependency inject domain objects with Spring ile ilgili Bahar belgelerinde bulunan bölümü okumanızı öneririm.

Genelde AOP Spring'in altyapısının temel bir parçası olduğunu göz önünde "Ben bağımlılıkları enjekte AOP kullanabilirsiniz, ama sonra bahar altyapısını yararlanarak değilim" dediniz ilginç. İkisi birlikte çok iyi geçin.

Yukarıdaki bağlantı, Spring'in AOP'sunun bağımlılıkları, Spring altyapısına doğrudan başvurmadan (örneğin, new işlecini kullanarak) oluşturulan etki alanı nesnelerine saydam olarak enjekte etmenize olanak tanır. Bu çok zekice, ancak bazı derin seviyelerde sınıf içi tinkering gerektiriyor.

+0

+1. Bununla birlikte, bu özel senaryonun karmaşıklığına bağlı olarak, AOP yerine FactoryBeans'i kullanmak mümkün olabilir (ve daha kolay). – ChssPly76

+0

Katılıyorum, normalde rahatsız olmazdım. Ancak, uygulama sert çekirdekli DDD ise, fabrikalar istenmeyebilir. – skaffman

5

Spring'in bağımlılık enjeksiyon/konfigürasyonu sadece bu benzeri veri kaynakları, işlem yönetimi, remoting, sunucu uygulaması monte noktaları ve düşük seviyede teknik altyapı, yapılandırmak için kastedilmektedir.

Teknik API'lar ve hizmetleriniz arasında geçiş yapmak için yayı kullanırsınız ve bu hizmetlerin içinde normal Java kodu yazabilirsiniz. Baharı, etki alanı modelinizden ve hizmet uygulamalarınızdan uzak tutmak iyi bir şeydir. Bir başlangıç ​​için, uygulamanızın iş mantığını bir çerçeveye bağlamak veya düşük düzeyli teknik sorunların uygulama etki alanı modelinize "sızmasını" istemezsiniz. Java kodunun, IDE'de yayının XML yapılandırmasından daha kolay değiştirilmesi, dolayısıyla iş mantığının java'da tutulması, yeni özellikleri daha hızlı sunmanıza ve uygulamayı daha kolay bir şekilde sürdürmenize izin verir. Java, Java'nın XML biçiminden çok daha etkileyici bir ifadedir, böylece düz Java'ya yapıştıysanız, alan adı kavramlarını daha net bir şekilde modelleyebilirsiniz.

+0

sadece Bahar CAN bir çok şey yapmak için doğru cevap uygulamanızın tüm bu şeyler için Bahar kullanmasını sağlamak anlamına gelmez. – M1EK

+0

Bu, standart anemik etki alanı modeli için doğru olsa da, IMO bu şeyleri bir alan yönlendirmeli tasarıma (OP'nin kullandığını söylediği) yapmak için çok uygundur. –

+0

Bu yanıt, nesne tabanlı bir tasarıma sahip olan ve etki alanı modeli nesnelerine yöntem olarak etki alanı mantığı uygulayan anemik olmayan etki alanı modellerine çok fazla (muhtemelen daha çok) uygulanır. Ve anemik etki alanı modelleri standart değildir. * Önlenecek birşeyler *. – Nat

İlgili konular