Varlık Çerçevesi ve Anemik Alan Modelinden Kaçınmak


11

İş mantığımızda bazen böyle bir şeyi tanımlayan yöntemlerimiz vardır:

User.ResetCourse(Course courseToReset)

Sorun, hem Kullanıcı hem de Ders'in Entity Framework proxy nesneleri olmasıdır. Bu, Kullanıcı veya Parkurda navigasyon özelliklerine bastığımızda, veritabanına büyük bir isabet yaratabileceği anlamına gelir, çünkü bu nesneler IQueryable değildir, bu yüzden normalde bunlar üzerinden yinelenir.

Bunu çözmek için imzayı şu şekilde değiştirdik:

User.ResetCourse(MyDBContext db, Course courseToReset)

Bu, ihtiyaç duyduğumuz değişiklikleri verimli bir şekilde yapmak için veritabanını doğrudan sorgulayabileceğimiz anlamına gelir, ancak Veritabanı bağlamını bir iş nesnesine geçirmek çok yanlış görünüyor.

Daha sonra bir hizmet katmanını kullanıcıya taşıdık, yani şöyle bir şeyimiz var:

CourseService.ResetForUser(Course courseToReset, User forUser)

Bu hizmetin yaratılmasında enjekte edilen DBContext'e bir referansı vardır, ancak şimdi iş nesnelerimiz sadece davranışsız veri torbalarıdır (yani Anemik Alan Modeli).

Bundan nasıl kaçınabiliriz?


11
Varlık çerçevesi modellerinin aslında bir etki alanı modeli değil, aslında DTO'lar olduğunun farkına varmışsınız gibi geliyor. Aslında DDD yapmaya mı çalışıyorsunuz? Değilse, muhtemelen önemli değil.
Bay Cochese

3
ADM artı hizmetleri birçok şey için iyi bir mimaridir
Ewan


2
@JohnWu bu çok taraflı bir makale. Aslında, zengin örnekte Aktif Kayıt modelini içererek zengin bir alan modelinin "Strawman" versiyonunu içerir. Elbette, Aktif Kayıt DDD'de desteklenmez ve genel olarak herhangi bir karmaşık uygulama için kötü bir seçimdir.
RibaldEddie

Yanıtlar:


8

Sorun, öncelikle EF nesnelerini etki alanı nesneleri olarak kullanmanızdır. EF nesneleri iş modelleri DEĞİL veri modelleridir.

İhtiyacınız olan şeyi yapma özgürlüğünü veren iş nesnelerini bildirmeniz ve daha sonra bunları bir depoyla geri almanız ve depolamanız gerekir. Deponuz EF varlıklarını iş varlıklarınızla eşler. EF nesneleri asla depolarınızın dışında kullanılmamalıdır.


0

Muhtemelen aşağıdaki gibi bir şey yaparak önleyebilirsiniz:

CourseService.prepareForUserCourseReset(DBContext db);
User.reset();
Course.reset();
CourseService.completeUserCourseReset(DBContext db);

Ya da sürüklenmemi yakalarsan, bunun için bir şey. Tanımladığınız ilk yolla sahip olduğunuz yaklaşım, performansla ilgilidir ve alan adının yapısı ile ilintili değildir. Bu nedenle, hizmet katmanındaki performans sorununu çözmeyi düşünmelisiniz, ancak davranışı etki alanında tutabilirsiniz. Daha iyi bir yanıt istiyorsanız, Kullanıcı / Kursu bu bağlamda sıfırlamanın ne anlama geldiğini bilmek de yararlı olacaktır.


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.