“Kontrolün Tersine Çevirilmesi” “Anemik Alan Modeli” ni destekliyor mu?


32

Son projemde IoC Container kullandığımda, anemik birimlerle ve Stateless Services'deki iş mantığımın çoğuyla karşılaştım.

Diğer geliştiriciler tarafından "Inversion of Control" (Kontrol İnversiyonu) kullanan ve her zaman "Anemik" yazan projeler gördüm.

"Anemic Domain Model" anti-patern olduğundan, IoC ve Rich Domain kullanmak mümkün müdür? Herhangi bir iyi örnek, bunu yapan açık kaynaklı projeler var mı?


Sanırım yardım etmek için kendi davanızın bazı örneklerini görmemiz gerekecek.
Martijn Verburg

1
Üzgünüm, kod pasajlarını kastetmiştim :)
Martijn Verburg

Yanıtlar:


11

Yeni başlayanlar için: DI ve IoC eşanlamlı değildir . Üzgünüm ama şunu belirtmeliyim (bana öyle olduğunu düşünüyorsun).

Sorunuz gelince ... Eh, Bağımlılık Enjeksiyonu sadece bir araçtır. Bu aracı nasıl kullanacağınız tamamen ayrı bir şey. Sorunu artırabilecek başka araçlar da (tasarım kalıpları) vardır. Örneğin, MVC modelinin geniş bir şekilde benimsenmesinin, Anemic Domain Model anti-patern oluşturmanın anahtar bileşenlerinden biri olduğunu düşünüyorum: Kontrolörler (daha basit uygulamalarda, daha karmaşık olanlarda Ek Hizmet Katmanı olacak), iş kurallarının doğrulanması sorumluluğunu üstlenir. DB varlıklarını faydalı bir şeye dönüştürmenin yanı sıra zorlamak, Business Katmanı ile veritabanı varlıklarına bire bir eşleşerek düz ORM olan basit Veri Erişim Katmanına dönüşür.

Kesinlikle uygulamanızı nasıl tasarlarsınız - isterseniz doğru bir Etki Alanı Modeli oluşturabilirsiniz ve tüm bu IoC, DI, MVC sizi durdurmaz. Seni durdurabilecek olan şey senin takımın. Her nasılsa, onları doğru yolu kullanmaya ikna etmeniz gerekiyor ve çoğu Yazılım Geliştiricinin güçlü bir mimari geçmişi olmadığı için zor olabilir.


Buna, belki de Eric Evans ve ark.nın benimsemiş olduğu DDD yaklaşımına göz atabileceğinizi ekleyeceğim.
Martijn Verburg

1
Eric Evans'ın kitabını okudum. Genel metodoloji ve her yerde kullanılan dil için iyidir, ancak gerçek dünyadaki örneklerde biraz eksiktir.
Mag20

DI ve IoC arasındaki farkı gösterdiğiniz için teşekkür ederiz. Ben konunun daha sonra DIC ile IoC ile ilgisi olduğunu düşünüyorum. Bunu yansıtacak şekilde soruyu değiştirdim.
Mag20

DI çerçeveler / konteynerlerin (Bahar DI, CDI, Birlik) ile benim deneyim, onlar gerçekten de yok bana gerçek (yani durum bilgisi) nesneleri kullanmaları engellenmektedir gerektiğini geliştiricilerin, "doğru Domain Modeli" oluşturma durdurmak . Fakat DI bunu desteklemiyor.
Rogério

8

(Hepsi değilse) uygulamaların çoğu altyapı ve alan kaygılarının bir karışımıdır. Belli bir karmaşıklık seviyesine ulaştığınızda, alanın altyapıdan ayrılıp ayrılmadığını yönetmeyi kolaylaştıracak, böylece nedenini düşünmek ve bağımsız olarak gelişmek kolaylaşacaktır.

Tabii ki, etki alanı modeli sistemin geri kalanıyla iletişim kurmaya ihtiyaç duyuyor ve genellikle bu durum kendilerine altyapı altyapısı (veri tabanı erişimi gibi) enjekte edilen vatansız hizmetlerle (etki alanının bir parçası) olacak. Bir IoC kabı kullanmak bu bağımlılığı ortadan kaldırmaz, konfigürasyonunu ayrı bir alana taşır - yine sebep ve bakım yapmayı kolaylaştırır.

İşletmeler devlet depolamakta ve iş kurallarından sorumlu olmalıdırlar. Hizmetleriniz tüm değişmezleri ve diğer iş kurallarını zorluyorsa, mantığın yanlış yerde olması muhtemeldir.

Şimdi, mantığı doğru yerlere yerleştirdiyseniz ve yine de, sadece mülk torbası olan altyapı işleri ve varlıkları etrafındaki sarıcılardan başka bir şey değil, o zaman alanın haklı çıkacak kadar karmaşık olmaması muhtemeldir. kendi modelinin ek yükü. DDD hakkında okuyacağınız herhangi bir şey hakkında, gerçekten yalnızca karmaşık alanlar için tasarlanan bir feragatname içerecek, ancak bunun hepsi çok sık unutulmuş gibi görünüyor.


7

Kaynağa git. Anemic Domain Modellerinde Fowler'in parçası ile başlayın . Eric Evan'ın Domain Driven Design'a iyi uygulama örneği olarak atıfta bulundu. Bunun için kaynak kodu burada . İndir.

Inversion of Control (@Autowired for search) kullandığını ve hizmet sınıfları (BookingService) ve "iş süreci" sınıfları (örneğin ItineraryUpdater) içerdiğini gözlemleyin.

Fowler'in orijinal makalesi, aradığınız örneğe giden yolu başlatır.


Aslında, bu örnek uygulama kitapta açıklandığı gibi DDD'ye uygun değil. Kitabın kendine özgü bir çelişki, etki alanına özel kod içermesine izin vererek "altyapı" kavramını tamamen ihlal etmesidir; örneğin, VoyageRepositoryHibernatealtyapı katmanına konan ancak aslında etki alanı katmanına bağlı olan sınıf.
Rogério

Evet, kitap sayfa 73'te altyapı katmanının etki alanı katmanının "altında" ve "hizmet verdiği alan hakkında özel bir bilgi sahibi olmaması gerektiğini" söylüyor. Bu sadece bana hiç mantıklı gelmedi. İki VoyageRepository uygulaması olan bir proje düşünün: VoyageRepositoryHibernate ve bir VoyageRepositoryJDBC sınıfı. Onların uygulamaları mutlaka çok farklı ve teknolojiye özgü. Bunlar etki alanı katmanına mı ait? Veya altyapı katmanı? Kodumuzda, kitaba göre geriye doğru yapıyoruz: altyapı katmanı etki alanı katmanına başvurabilir, ancak bunun tersi geçerli değildir.
jamie

Bunlar etki alanı katmanına aittir, evet. JDBC tabanlı uygulama, uygulama veritabanındaki etki alanına özgü tablo ve sütunlara bağlı SQL kodunu içerir. Etki alanına veya uygulamaya özgü herhangi bir kodu altyapı katmanına koymak yalnızca yanlıştır, çünkü "altyapı kodu" yalnızca teknik sorunları çözmek için kullanılmalıdır ve (ideal olarak) farklı uygulamalar ve alanlar arasında yeniden kullanılabilir olmalıdır. Etki alanı katmanında "düşük seviye" koduna (örneğin, SQL) sahip olmanın çözümü, onu tamamen dışa taşımak değil, ORM gibi daha iyi altyapının üstüne uygulamaktır.
Rogério

Bana göre, tasarrufun uygulanması (MyDomainObject foo) tamamen teknik bir sorundur. YMMV.
jamie

Yalnızca katmanlı bir mimarinin temel kuralını ihlal etmenize yol açmazsa: daha düşük bir katman daha yüksek bir katmana bağlı olamaz . Bu nedenle, save(foo)etki alanı modeli değiştiğinde değişime tabi olan bir kod uyguladıysanız (örneğin, yeni bir özellik eklenirse MyDomainObject), (tanım gereği) etki alanı katmanına ait olmalıdır; Aksi takdirde, artık sadece "katmanlara" sahip olmaktan söz edemezsiniz.
Rogério

7

IoC ve Rich Domain kullanmak mümkün mü? Herhangi bir iyi örnek, bunu yapan açık kaynaklı projeler var mı?

Sanırım IoC yerine DI demek istiyorsun ve üzerinde çalıştığın proje Spring gibi bir DI kap kullanıyor. IoC'nin iki ana lezzeti vardır: DI ve Konumlandırıcı modeli. Konumlandırıcı modelinin neden bir sorun olması gerektiğini anlamıyorum, o zaman DI'ye odaklanalım.

Bunun mümkün olduğunu sanmıyorum, ya da en azından çok pratik olacağını düşünüyorum. DI kaplarının ana yönü, başkalarına enjekte ettikleri zaman nesnelerin oluşumunu kontrol etmeleridir ("yönetilen nesneler"). Projeler çalışırken canlı olan yönetilen nesne kümesi, projenizde hangi etki alanı öğelerinin bulunduğundan bağımsızdır, ancak nesnelerin nasıl kablolandığına ve bunlara hangi kapsamların (tekil, prototip) atandığına bağlıdır.

Bu nedenle DI konteynerinin etki alanı nesnelerinizi yönetmesine izin vermek istemezsiniz. Ancak, nesneleri manuel olarak (yeni) oluşturursanız, etki alanı nesnelerinize enjekte edilen diğer nesneleri alamazsınız. (Potansiyel çalışma ortamını manuel kablolama ile bir kenara bırakın.) Uygulamaları diğerleriyle değiştirmek için bu enjeksiyonlara ihtiyacınız olduğundan, DI kullanarak zengin alan nesnelerinin işlevselliğini değiştiremezsiniz. Bu nedenle, işlevselliği etki alanı nesnelerine yerleştirmek istemeyeceksiniz veya DI'nin özelliklerini kaybedeceksiniz.

Nesnelerinizi yönetmeyen varsayımsal bir DI kapsayıcısının nasıl çalıştığını göremiyorum ve mevcut uygulamaların hiçbiri buna izin vermiyor. Bu yüzden DI'nin nesneleri yönetmeye dayandığını iddia etmek doğru olur. Bu nedenle, potansiyel Rich Domain nesnelerini bir anemik sınıfa ve bir veya birkaç işlem betiği sınıfına ayırmanız her zaman için sizi teşvik edecektir.


Bu cevap, bir Zengin Etki Alanı Modeli ile Bağımlılık Enjeksiyonu arasındaki gerginlik söz konusu olduğunda kafanın üstüne çiviyi vuruyor.
jrahhali
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.