Etki alanı merkezli karmaşık bir uygulamada temel CRUD işlemlerine DDD yaklaşımı


9

Şirketim web uygulamamızı sıfırdan yeniden yazıyor. Finans sektöründe karmaşık bir alana sahip büyük bir kurumsal düzeyde uygulamadır.

Kalıcılık için ORM (Varlık çerçevesi) kullanıyoruz.

Temel olarak, uygulamalarımızın yarısı kullanıcıdan ham veri toplama, depolama ve ardından gerçek alan mantığımızın çoğunu içeren uygulamanın diğer yarısı, bu orijinal verilerden, orijinalinden çok farklı olan alan resmimizi oluşturmak için bu ham verileri alır. ham girdiler ve onu bir calc motoruna geçirir, calcs çalıştırır ve daha sonra kullanıcıya görüntülenen sonuçları verir.

Katmanları kullanan bir DDD yaklaşımında, CRUD işlemleri etki alanı katmanından geçer gibi görünüyor. ama en azından bizim durumumuzda, bu mantıklı görünmüyor.

Bir kullanıcı, örneğin bir yatırım hesabını değiştirmek için düzenleme ekranına gittiğinde, ekrandaki alanlar, daha sonra hesaplamalar için kullanılan etki alanı temsili değil, veritabanında depolanan tam alanlardır. Öyleyse, düzenleme ekranı veritabanı temsiline (ham girdiler) ihtiyaç duyduğunda neden yatırım hesabının etki alanı sunumunu yükleyeyim?

Kullanıcı yatırım hesabı ekranında "Bitti" yi tıkladıktan ve denetleyiciye bir POST işlemi yapıldıktan sonra, denetleyici artık kaydetmesi gereken yatırım hesabının tam olarak tam bir veritabanı temsiline sahiptir. Ancak bazı nedenlerden dolayı, denetleyicinin modelini doğrudan veritabanı modeline (Entity framework model) eşlemek yerine, değişiklik yapmak için etki alanı temsilini yüklemem gerekiyor mu?

Aslında özünde bir veri modelini etki alanı modeliyle eşleştiriyorum. Bu nasıl bir anlam ifade ediyor?

Yanıtlar:


9

Form oluşturma sayfanızı doğrudan bir EF nesnesiyle eşleştirerek hesap oluşturma sayfanızı uyguladığınızı ve daha sonra db'ye kaydedildiğinizi düşünün.

Ayrıca, veritabanının tamamen yanlış verilerin girilmesini engelleyen çeşitli kısıtlamalara sahip olduğunu varsayalım. Hesapların her zaman Müşterileri vb. Vardır.

Herşey yolunda gibi görünüyor. Ama sonra iş yeni bir kural koyuyor.

  • Perşembe günü oluşturulan hesaplara% 2 bonus faiz oranı uygulanır. (faiz oranının hesap alanlarından biri olduğunu varsayalım)

Şimdi bu mantığı bir yere koymanız gerekiyor ve içine koyacağınız bir etki alanı nesneniz yok.

DDD, her zaman bu tür kurallara sahip olacağınızı ve muhtemelen sahip olduğunuzu varsayar. Bir hesap oluşturmak çeşitli kontrollere, denetim günlüğüne vb. Sahip olmalıdır, sadece 'db'ye bir satır yaz'

Ekstra mantık ile kalıcılık veya MVC denetleyicileri olmadığını varsayarak etki alanınızı planlayın. Tüm gereksinimleri ve bunların etki alanı modelinde bulunduğundan emin olun .


3
Bunu koymak için iyi bir yol. DB ayrıntılarıyla karıştırılmış iş kuralları bulmaktan nefret ediyorum. +1
candied_orange

İyi puan, ancak bu doğrulama kuralları yalnızca kullanıcı girdilerinin oluşturulması ve güncellenmesi sırasında geçerliyse ne olur? Sonra kullanıcı girişlerini aldıktan sonra, hesaplamaları çalıştırırken oluşturulan model tamamen farklı bir modeldir. Yatırım hesabı için iki alan modelimiz olmalı mı? Biri kullanıcı için ham girdilerin CRUD işlemleri için, diğeri de bu girdiler hesaplamalarda kullanılan etki alanı modelini oluşturmak için kullanıldığında?
wired_in

sorularımı karıştırıyorum. tam bir örnek vermelisiniz. Etki alanı mantığınız varsa bir etki alanı nesnesine gitmelidir. Bu, ilkinden daha sonra başka bir etki alanı nesnesi oluşturamayacağınız anlamına gelmez
Ewan

Karmaşık bir hesaplama motoru hayal edin. Hesaplamaları çalıştırmak için ihtiyaç duyduğu girdilerden biri bir yatırım hesabıdır, ancak yatırım hesabının tüm yatırım hesabı bir süre boyunca bir gelir akışıdır. Bir yatırım hesabının bu etki alanı modeli, kullanıcının bu yatırım hesabı için girdiği ham girdilerden tamamen farklıdır. Bununla birlikte, kullanıcı Name, Current Value, vb. Gibi temel girişleri girerken hala doğrulama mantığı olması gerekir, ancak calc motorunun kullandığı modelle hiçbir ilgisi olmamalıdır. Burada bir yatırım hesabı için iki alan modeli var mı?
wired_in

..... ya da belki de bir yatırım hesabı modelinin CRUD işlemleri için aşırıya
kaçması

7

Bu nasıl bir anlam ifade ediyor?

Kısa cevap: değil .

Daha uzun cevap: Bir etki alanı modeli geliştirmek için kullanılan ağır kalıplar, çözümünüzün yalnızca bir veritabanı olan kısımları için geçerli değildir.

Udi Dahan'ın bunu açıklığa kavuşturabilecek ilginç bir gözlemi vardı

Dahan, bir hizmetin hem bir çeşit işlevselliğe hem de bazı verilere sahip olması gerektiğini düşünmektedir. Verileri yoksa, sadece bir işlevdir. Tüm yaptığı veriler üzerinde CRUD işlemleri gerçekleştiriyorsa, veritabanıdır.

Sonuçta, etki alanı modelinin amacı, verilerdeki tüm güncellemelerin mevcut işletme değişmezini korumasını sağlamaktır. Veya başka bir deyişle, kayıt sistemi olarak görev yapan veritabanının doğru olmasını sağlamak etki alanı modelinden sorumludur .

Bir CRUD sistemi ile uğraşırken, genellikle veriler için kayıt sistemi değilsinizdir. Gerçek dünya kaydının kitaptır ve veritabanı gerçek dünyanın sadece yerel olarak önbelleğe temsilidir.

Örneğin, bir e-posta adresi veya devlet tarafından verilen bir kimlik numarası gibi bir kullanıcı profilinde görünen bilgilerin çoğu, işletmenizin dışında yaşayan bir hakikat kaynağına sahiptir - başkasının e-posta adreslerini atayan ve iptal eden bir posta yöneticisi değildir. uygulamanız. SSN'leri uygulayan hükümet, uygulamanız değil.

Yani normalde size dış dünyadan gelen veriler üzerinde herhangi bir alan doğrulaması yapmayacaksınız ; verilerin iyi biçimlendirildiğinden ve düzgün bir şekilde dezenfekte edildiğinden emin olmak için kontroller yapmış olabilirsiniz ; ancak bu sizin verileriniz değildir - alan adınızın modeli veto almaz.

Katmanları kullanan bir DDD yaklaşımında, CRUD işlemleri etki alanı katmanından geçer gibi görünüyor. ama en azından bizim durumumuzda, bu mantıklı görünmüyor.

Veritabanının kayıt defteri olduğu durum için bu doğru .

Ouarzy böyle koydu .

Birçok eski kod üzerinde çalışarak, alanın içinde ve dışında neler olduğunu belirlemek için yaygın hatalar gözlemliyorum.

Bir uygulama yalnızca veri modeli etrafında iş mantığı yoksa CRUD olarak düşünülebilir. Bu (nadir) durumda bile, veri modeliniz etki alanı modeliniz değildir. Bu sadece, hiçbir iş mantığı dahil olmadığından, onu yönetmek için herhangi bir soyutlamaya ihtiyaç duymadığımız anlamına gelir ve bu nedenle etki alanı modelimiz yoktur.

Etki alanının içindeki verileri yönetmek için etki alanı modelini kullanırız; alan adının dışındaki veriler zaten başka bir yerde yönetiliyor; yalnızca bir kopyasını önbelleğe alıyoruz.

Greg Young depo sistemlerini , kayıt defterinin başka bir yerde (yani depo katı) olduğu çözümlerin birincil bir örneği olarak kullanır . Açıkladığı uygulama sizinki gibidir - depodan alınan mesajları yakalamak için bir mantıksal veritabanı ve daha sonra bu mesajların analizinden çıkarılan sonuçları önbelleğe alan ayrı bir mantıksal veritabanı.

Belki burada iki sınırlı bağlamımız var? Her biri için farklı bir modelinvestment account

Olabilir. Sınırlı bir bağlam olarak etiketlemek konusunda isteksiz olurum, çünkü diğer bagajların beraberinde ne getirdiği açık değildir. İki bağlamınız olabilir, henüz almamış olduğunuz her yerde bulunan dilde küçük farklılıklar olan bir bağlam olabilir.

Olası turnusol testi: Bu spektrumu karşılamak için kaç alan adı uzmanına veya yalnızca bileşenler hakkında farklı şekillerde konuşan bir alan adı uzmanına ihtiyacınız var. Temel olarak, Conway yasasını geriye doğru çalışarak kaç sınırlı bağlamınız olduğunu tahmin edebilirsiniz.

Sınırlı bağlamların hizmetlerle hizalandığını düşünüyorsanız, daha kolay olabilir: bu iki işlevselliği bağımsız olarak dağıtabilmeniz gerekir mi? Evet, iki sınırlı bağlam önerir; ancak senkronize tutulmaları gerekiyorsa, belki de sadece bir tanesidir.


Doğrulama ve varsayılan mantık var, ancak sadece bir yatırım hesabı için ham girdileri oluştururken / güncellerken geçerlidir. Sonra yatırım hesabı için bir kalk motoru için girdi olarak kullandığımızda çok daha zengin bir model kullanıyoruz. Belki burada iki sınırlı bağlamımız var? Her biri bir yatırım hesabı için farklı bir modele sahip '
wired_in

Birkaç yıl sonra buna geri döndüm ve yorumunuz bir sebepten ötürü şimdi daha önce yankılanıyor. Burada çok iyi şeyler var, ama benim için bir şeyi açıklayabilir misiniz? "Etki alanı modelinin nihayetinde, verilerdeki tüm güncellemelerin mevcut işletme değişmezini korumasını sağlamak" dediniz. Bu, uygulamamızın bilgileri kaydeden / güncelleyen kısmı için geçerlidir. Diğer kısım ise sadece bir hesaplama motorudur. Verilerin girdi olarak temsilini alır ve sonuçları verir. Bu etki alanı modelinin bir parçası değil mi? Saklanan verileri etkilemediğinden?
wired_in

2

Alan adınızda veritabanının bile var olduğunu bilmeniz gerekmez.

Alan adınız iş kuralları ile ilgilidir. Veritabanınızı yapan şirket iş dışına çıktığında hayatta kalması gereken şeyler. Yani, şirketinizin hayatta kalmasını istiyorsanız. Bu kurallar, veriyi nasıl sürdürdüğünüzü değiştirmemeniz önemli değildir.

Veritabanı ayrıntıları mevcuttur ve ele alınması gerekir. Başka bir yerde yaşamalılar. Onları bir sınırın ötesine koyun. Bu sınır boyunca nasıl iletişim kurduğunuzu dikkatlice kontrol edin, yoksa bir sınır değildir.

Bob Amca, verilerinizi ne koyacağınız hakkında şunları söyleyecektir:

Tipik olarak sınırları geçen veriler basit veri yapılarıdır. İsterseniz temel yapıları veya basit Veri Aktarımı nesnelerini kullanabilirsiniz. Veya veriler, işlev çağrılarındaki bağımsız değişkenler olabilir. Veya bir hashmap içine paketleyebilir veya bir nesneye inşa edebilirsiniz.

Önemli olan, yalıtılmış, basit, veri yapılarının sınırların ötesine geçmesidir. Varlıkları veya Veritabanı satırlarını kopyalamak ve geçmek istemiyoruz. Veri yapılarının Bağımlılık Kuralını ihlal eden herhangi bir bağımlılığa sahip olmasını istemiyoruz.

[…] Verileri bir sınırın ötesine geçirdiğimizde, daima iç çember için en uygun olan biçimdedir.

Temiz Mimari

Ayrıca dış katmanlarınızın iç katmanlarınıza nasıl eklentiler olması gerektiğini açıklar, böylece iç katmanlar dış katmanların var olduğunu bile bilmez.

Temiz mimari hile sayfası

Bunun gibi bir şey izleyin ve giriş doğrulama kuralları, girişin bir şekilde kalıcı olması gereken kurallar, hesaplamaları çalıştırmak için kurallar, bu sonuçları herhangi bir çıktıya göndermek için kurallar hakkında endişelenebileceğiniz veritabanını görmezden gelmek için güzel bir yere sahip olacaksınız. Aslında bu tür kodları okumak daha kolay.

Bu ya da alan adınızın gerçekten sadece veritabanını manipüle etmek olduğuna karar verirsiniz. Bu durumda etki alanı diliniz SQL'dir. Eğer öyleyse, ancak iş kurallarını uygulamanızın kalıcılıkta bir değişiklikten kurtulmasını beklemeyin. Sonunda bunları tamamen yeniden yazmanız gerekecek.


Bir ORM (Entity Framework) kullanıyoruz, bu yüzden veritabanımız zaten soyutlanmış durumda, ancak veri modelleri (Entity framework sınıfları) doğal olarak veritabanı tablolarıyla neredeyse 1'e 1. Sorun, uygulamamızın bazı bölümlerinde kullanıcı aslında sadece veri modelini güncellemesidir (ekran, her metin kutusunun veritabanındaki bir alan olduğu (veri modeli) sadece metin kutularının bir listesidir.
wired_in

Bu yüzden, CRUD işlemleri yaparken yalnızca ham verilerin (veri modeli) temsillerini kullanmak için bir neden görmüyorum. Hesaplamalar için kullanılan, alan modelimiz olarak gördüğüm karmaşık bir alan adı temsiline sahibiz, ancak bu resmi neden uygulamamızın CRUD bölümüne yükleyeceğimi anlamıyorum.
wired_in

Ne demek istediğinizi "ham verilerin temsillerini kullanın" ile tanımlayın. Veriler girilir, veriler etki alanı kurallarına göre doğrulanır, veriler bir şekilde kalıcıdır, veriler karşı hesaplanır, sonuçlar her şeye gönderilir. Bir şey mi kaçırıyorum?
candied_orange

Bir yatırım hesabı için kullanıcıdan aldığımız ham verilerin, yatırım hesabı için kullanıldığında olduğu gibi, başvurumuzun ana bölümlerinde bu yatırım hesabını nasıl temsil ettiğimizi söylemeye çalışmıyorum. Örneğin, veritabanına kaydettiğimiz IsManagedAccount adlı bir boole girdimiz olabilir. Kullanıcı bunu düzenleme ekranındaki bir radyo düğmesi aracılığıyla bize sağlar. Böylece, veritabanından ekrana kadar olan gösterim 1'e 1 olur. Etki alanı modelimizi daha sonra uygulamada oluşturduğumuzda, bir ManagedAccount sınıfımız olabilir, bu nedenle boolean özelliği yoktur. İki yapı oldukça farklıdır.
wired_in

Kullanıcı bir düzenleme ekranında sadece ham girdileri düzenlerken, neden alan resmini yükler ve sonra bir şekilde güçlü bir şekilde yazılan ManagedAccount sınıfını bir IsManagedAccount ile tek bir sınıfa dönüştüren düz bir gösterime neden çok karmaşıklık eklerim? Emlak?
wired_in

1

DDD teorisini uygulama:

Bu alanda iki Sınırlı Bağlam vardır:

  • Yatırım hesabının hesaplanması. Yatırım hesabı matematiksel modeli bir Agrega belki bir öğedir.
  • Çekirdek Finans. Müşteri yatırım hesabı Varlıklardan biridir.

Her Sınırlı Bağlam farklı bir mimari tasarıma sahip olabilir.

Misal:

Müşteri Yatırım Hesabı, bir Varlıktır (belki bir Toplama, etki alanına bağlıdır) ve verilerin kalıcılığı, Varlık Deposu (RDB veya OO Veritabanı gibi başka bir DB türü) aracılığıyla yapılır.

CRUD operasyonlarına DDD yaklaşımı yoktur. Bir DB alanının bir nesnenin verisine bağlı olması tasarım ilkelerini ihlal eder.

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.