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.
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. –
@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 –
@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. –