यहां एक समस्या का एक सरल उदाहरण है जो मैं चला रहा हूं, यहां प्रस्तुत किए गए कुछ विचारों और डीडीडी के संबंध में अन्य स्थानों के साथ जासूसी नहीं कर रहा है।डीडीडी, इकाई फ्रेमवर्क, कुल इकाई व्यवहार (व्यक्ति.एडईमेल, आदि)
कहें कि मेरे पास एक एएसपी.नेट एमवीसी 3 साइट है जो किसी व्यक्ति को बनाता/कुशल बनाती है। नियंत्रक एक एप्लिकेशन सेवा परत (PersonService) तक पहुंचते हैं जो बदले में डोमेन इकाइयों (ईएफ 4 पीओसीओ) और पर्सनल रिपॉजिटरी का उपयोग करने और उन्हें जारी रखने के लिए उपयोग करता है। मैं सादगी के लिए यहां सभी इंटरफेस छोड़ रहा हूं। व्यक्ति इस मामले में जड़ है और सादगी के लिए केवल ईमेल पते हैं (यह भी मान लें कि ईमेल अपरिवर्तनीय नहीं है और इसे अपडेट किया जा सकता है)।
विकल्प 1: डीडीडी की मूलभूत बातें [मेरी समझ] के साथ चिपकने का प्रयास करें जहां इकाई से संबंधित व्यवहार सीधे इकाई के हिस्से के रूप में लागू किया जाता है (व्यक्ति लागू करता है AddEmail, ChangeEmail, आदि)। इसके साथ एकमात्र समस्या, जोड़ें * विधियों के अपवाद के साथ, यह है कि व्यक्ति को संदर्भ या इकाई ढांचे के टुकड़ों (जो किसी भी दृढ़ता अज्ञान को हटा देगा) के बारे में जानना होगा या चिह्नित करने के लिए "सेवा" या भंडार का उपयोग करने की आवश्यकता होगी संशोधित के रूप में ईमेल।
// Person Service
public class PersonService {
// constructor injection to get unit of work and person repository...
// ...methods to add/update a person
public EmailAddress AddEmailAddress(int personId, EmailAddress email)
{
Person p = personRepository.Find(p => p.Id == personId).First();
p.AddEmail(email);
uow.SaveChanges();
return email;
}
public EmailAddress ChangeEmailAddress(EmailAddress email)
{
Person p = personRepository.Find(p => p.Id == personId).First();
p.ChangeEmail(email);
// change state of email object here so it's updated in the next line???
// if not here, wouldn't the Person entity have to know about the context
// or use a service?
uow.SaveChanges();
return email;
}
}
// Person Repository
public class PersonRepository
{
// generic repository implementation
}
// Person Entity
public class Person
{
public string Name { get;set; }
public IEnumerable<EmailAddress> EmailAddresses { get;set; }
public void AddEmail(EmailAddress email)
{
this.EmailAddresses.Add(email);
}
public void ChangeEmail(EmailAddress email)
{
EmailAddress orig = this.EmailAddresses.First(e => e.Id == email.id);
// update properties on orig
// NOW WHAT? [this] knows nothing about the context in order to change state,
etc, or do anything to mark the email add updated
}
}
// Email
public class EmailAddress
{
public string Email { get;set; }
public bool IsPrimary { get;set; }
}
विकल्प 2: व्यक्ति सेवा भंडार का उपयोग जोड़ने/ईमेल पते को अपडेट करने के लिए और व्यक्ति इकाई पर व्यवहार को लागू नहीं करते हैं। कई रिश्तों के लिए यह बहुत आसान है (उदाहरण के लिए, पता, जहां काम को पूरा करने के लिए दो तालिकाओं को अद्यतन करने की आवश्यकता है) लेकिन मॉडल तब 'एनीमिक' बन जाता है जो गेटर्स और सेटर्स का एक गुच्छा है।
// Person Service
public class PersonService {
// constructor injection to get unit of work and person repository...
// ...methods to add/update a person
public EmailAddress AddEmailAddress(int personId, EmailAddress email)
{
Person p = personRepository.Find(p => p.Id == personId).First();
personRepository.AddEmail(personId, email);
uow.SaveChanges();
return email;
}
public EmailAddress ChangeEmailAddress(EmailAddress email)
{
personRepository.ChangeEmail(email);
uow.SaveChanges();
return email;
}
}
// Person Repository
public class PersonRepository
{
// generic repository implementation
}
// Person Entity
public class Person
{
public string Name { get;set; }
public IEnumerable<EmailAddress> EmailAddresses { get;set; }
}
// Email
public class EmailAddress
{
public string Email { get;set; }
public bool IsPrimary { get;set; }
}
वैसे भी, इस पर कोई विचार?
धन्यवाद, ब्रायन
अच्छा, साफ और समझने में आसान प्रश्न।:) –