2011-12-06 24 views
5

Programlama dilim C#. Etki alanı modelimde süreklilik cehaletiyle ilgili bir sorum var.Kalıcı bilgisiz Domain Layer

ı şöyle bir kişinin sınıfını var varsayalım:

public class Person 
{ 
    private string email; 

    public string Email 
    { 
     get { return email; } 
     set { email = value; } 
    } 

    public Person(string email) 
    { 
     this.email = email; 
    } 
} 

Şimdi benim alan modeli içinde, aynı e-posta adresine sahip iki kişi olamaz bu bir kural yoktur. Bu yüzden, yeni bir kişiyi başlatırken, bunun e-posta özelliğini değiştirirken olduğu kadar doğrulanması gerekir. Bu yüzden, süreklilik alanı cehennemi içinde böyle bir geçerliliği nasıl çözeceğinizi merak ediyordum. Şu anda yapmakta olduğum kişi deposu enjekte ettiğim kişi örneği için bir fabrika kalıbı kullanmak. Orada aynı e-posta adresine sahip başka birini arayabilirim. böylece gibi:

public class PersonFactory 
{ 
    private static readonly IPersonRepository personRepository; 

    public Person CreateNewPerson(string email) 
    { 
     Person personWithSameMail = personRepository.GetPersonByEmail(email); 

     if (personWithSameMail != null) 
      throw new ApplicationException("Email already exists."); 

     return new Person(email); 
    } 

    public PersonFactory(IPersonRepository personRepository) 
    { 
     this.personRepository = personRepository; 
    } 
} 

Ama (geçerli bir iş durumu olabilir) kişiler e-posta adresini değiştirirken bu çözümü, çeki kullanarak yine kapsamında değildir. Ayrıca, Kişi sınıfı hala bir kamu kurucusunu ortaya çıkarır ve fabrikayı baypas ederek, çift e-posta adresleri olan kişiler yine de mümkün olacaktır.

Bunun için zarafet çözümleri var mı?

P.S.

Muhtemelen bütün bu soru zaten kullanılmıyor:;: tüm veriler merkezli insanlara

GÜNCELLEME) Hayır, veri erişim katmanında dupe e-postaları doğrulamak istemiyorum. Bir alan modeli bağlamında yinelenen e-postaların kontrol edilmesi her zaman herkesin farkında olan bir şey ister. "Bir şey" bir adres defteri veya tüm bireyleri e-posta adresleri içeren tüm dünya olabilir. Bu yüzden belki de programcıların problemlere teknik olarak zarif çözümler ihtiyacını karıştırıyorum, sadece tam ve iyi düşünülmüş bir alan modelinin olmaması nedeniyle var. Buradaki durum böyle olabilir mi? Sadece bir e-posta adresi uzayda gezinen bir kişi değil (hey, uzay benim agregat kökü olurdu;)) sadece varoluş eğlencesi için? Ancak, bu, bir adres defteri uygulaması gibi gerçek bir iş durumu olacaksa, adres defteri kişinin toplam kökü olacaktır ve bu nedenle, yinelenen e-posta adresi olmadığından emin olmak için dahili koleksiyonundaki tüm kişileri kontrol edebilir.

+0

Neden yapıcıyı dahili yapmıyorsunuz ve ayrıca güncelleme sırasında e-posta adresini kontrol etmiyorsunuz? Ve bir fabrikaya bir depo vermenin güzel bir çözüm olduğunu düşünmüyorum. Fabrikayı arayan servis fonksiyonu, e-posta adresinin mevcut olup olmadığını kontrol etmelidir. –

+0

@WouterdeKort: Yorumunuz ile aynı fikirde değilim: (1) Dahili içeriğin herhangi bir şeye yardımcı olmaması. Yine de çift posta adresleri olan kullanıcıların oluşturulmasına izin verir. (2) Fabrikayı çağıran yöntemi yapmak, kontrolü etkin bir şekilde iş kuralını kaldırır. Şimdi bu kuralı uygulamak için arayanlara kalmıştır. Bu sadece çok zayıf bir API tasarımıdır –

+0

@DanielHilgarth Kamu kurucusunun bir sorun olduğunu açıkça belirtmektedir. Bir Fabrika, tüm bağımlılıklara ve gerekli değerlere sahip bir nesne oluşturmalıdır. İş mantığını bir fabrika ile karıştırmak, kötü tasarım olarak adlandırdığım bir şey. –

cevap

2

Ben bir DDD uzmanı değilim, ancak benim buna benzer şekilde.

Her şeyden önce, benim için tasarımdaki en büyük kusur, varlıkların ayarlayıcılara izin vermesidir. Yani, , topluluğun kökünü bilmeden, varlığınızın durumunu değiştirebilir. Ayarlayıcıları kaldırmayı ve sadece nesne oluştururken kurucudan ayarlamayı reddederdim.

Başka bir nokta. Kişi, e-postanın geçerliliğini (e-postanın zaten kullanılmış olup olmadığını kontrol etme şeklinde) yapmamalıdır, çünkü yalnızca kendi devletinin ve ilgili alt öğelerin varlığından haberdar olabilir. O zaman benim için kötü tasarım olan varlıktan depoya bir referans vermelisiniz. Bu yüzden düşündüğüm fabrikayı kullandın.

Doğrulamanın mümkün olduğu kadar hızlı başarısız olması için doğrulama işleminin öncelikle UI'de gerçekleştirilmesi gerektiğini düşünüyorum. Ama bu yeterli değil. Etki alanı durumunuzu sürdürürken, Kişinin benzersiz bir e-postası olduğu kuralını uygulamanız gerekir.Ben kişilerin e-postalar ise, ilk kontrol ediyorum doğrulama IPersonRepository ve devam etmek onun koleksiyonuna kişi varlığı eklemeden önce bir başvuru olurdu PersonRegistrationService denilen gibi bir alan adı hizmetinde meydana gerektiğini düşünüyorum benzersiz. Değilse, kullanıcıyı bir hatayla bilgilendirir ve varlığı eklemezdim.

Ne düşünüyorsunuz?

+0

Önerilerinizden anladığım kadarıyla, bir kişinin oluşturulması, alan adı dahili olmalıdır. Ve sonra, bir kişinin, alanla ilgili bir varlığın bile varlığını kabul etmesini doğrulayan bir şey gibi bir eylem hizmeti olacak mı? Yani bu hizmet, gerekli tüm başlangıç ​​kişilik özelliklerini argüman olarak alacak ve daha sonra, depoları enjekte ederek, "verilen verilere sahip olan kişinin var olması" ile ilgilenebilir? – Chris

+0

Bence hizmet ilk sırada bir çeşit alan konseptidir. Kayıt Servisi'ni önerdim çünkü insanın ince havayı yaratması bana mantıklı gelmiyor. Bu nedenle, bu hizmetin sorumluluğu argümanları almak olacaktır (veya bu zaman noktasında, alanın durumuna ait olmayan yeni Kişi tüzel kişiliği), e-posta benzersizse depoyu doğrulayın ve sonra kişiye ekleyin. iç koleksiyon (ORM veya başkaları tarafından devam ettirilecek, ancak bu sadece önemli değil). –

+0

Belki başkaları bunu aldılar ancak alan hizmetinden geçmek makul görünüyor. Aslında, fabrikanıza oldukça benzerdir, ancak fark, hizmetin bir etki alanı anlamına gelmesi ve depoya başarılı bir şekilde validasyon yapıldıktan sonra kişiyi eklediğidir (bu, kalıcı olan bir Kişi varlıkları topluluğudur) –