रिच बनाम एनीमिक डोमेन मॉडल की बहस में, इंटरनेट दार्शनिक सलाह से भरा है लेकिन आधिकारिक उदाहरणों पर संक्षिप्त है। इस प्रश्न का उद्देश्य निश्चित दिशा-निर्देश और उचित डोमेन-डिज़ाइन डिज़ाइन मॉडल के ठोस उदाहरणों को खोजना है। (आदर्श रूप से C # में।)
वास्तविक दुनिया के उदाहरण के लिए, DDD का यह कार्यान्वयन गलत प्रतीत होता है:
नीचे दिए गए WorkItem डोमेन मॉडल संपत्ति के बैग के अलावा और कुछ नहीं हैं, जिनका उपयोग कोड-प्रथम डेटाबेस के लिए एंटिटी फ्रेमवर्क द्वारा किया जाता है। प्रति फाउलर, यह एनीमिक है ।
WorkItemService परत जाहिर तौर पर डोमेन सेवाओं की एक आम गलत धारणा है; इसमें WorkItem के लिए सभी व्यवहार / व्यावसायिक तर्क शामिल हैं। यमलीआनोव और अन्य लोगों के अनुसार, यह प्रक्रियात्मक है । (पृष्ठ ६)
तो अगर नीचे गलत है, तो मैं इसे सही कैसे बना सकता हूं?
व्यवहार, अर्थात् AddStatusUpdate या Checkout , WorkItem वर्ग में सही होना चाहिए?
WorkItem मॉडल में क्या निर्भरताएं होनी चाहिए?
public class WorkItemService : IWorkItemService {
private IUnitOfWorkFactory _unitOfWorkFactory;
//using Unity for dependency injection
public WorkItemService(IUnitOfWorkFactory unitOfWorkFactory) {
_unitOfWorkFactory = unitOfWorkFactory;
}
public void AddStatusUpdate(int workItemId, int statusId) {
using (var unitOfWork = _unitOfWorkFactory.GetUnitOfWork<IWorkItemUnitOfWork>()) {
var workItemRepo = unitOfWork.WorkItemRepository;
var workItemStatusRepo = unitOfWork.WorkItemStatusRepository;
var workItem = workItemRepo.Read(wi => wi.Id == workItemId).FirstOrDefault();
if (workItem == null)
throw new ArgumentException(string.Format(@"The provided WorkItem Id '{0}' is not recognized", workItemId), "workItemId");
var status = workItemStatusRepo.Read(s => s.Id == statusId).FirstOrDefault();
if (status == null)
throw new ArgumentException(string.Format(@"The provided Status Id '{0}' is not recognized", statusId), "statusId");
workItem.StatusHistory.Add(status);
workItemRepo.Update(workItem);
unitOfWork.Save();
}
}
}
(यह उदाहरण अधिक पठनीय होने के लिए सरल किया गया था। कोड निश्चित रूप से अभी भी क्लंकी है, क्योंकि यह एक भ्रमित प्रयास है, लेकिन डोमेन व्यवहार था: संग्रह इतिहास में नई स्थिति को जोड़कर अद्यतन स्थिति। अंततः मैं अन्य उत्तरों से सहमत हूं, यह बस CRUD द्वारा नियंत्रित किया जा सकता है।)
अपडेट करें
@AlexeyZimarev ने सबसे अच्छा जवाब दिया, जिमी बोगार्ड द्वारा सी # में इस विषय पर एक सही वीडियो, लेकिन यह स्पष्ट रूप से नीचे टिप्पणी में ले जाया गया था क्योंकि यह लिंक से परे पर्याप्त जानकारी नहीं देता था। मेरे पास मेरे जवाब में वीडियो का सारांश देते हुए मेरे नोट्स का एक मोटा ड्राफ्ट है। कृपया किसी भी सुधार के साथ उत्तर पर टिप्पणी करने के लिए स्वतंत्र महसूस करें। वीडियो एक घंटे लंबा है लेकिन देखने लायक है।
अपडेट - 2 साल बाद
मुझे लगता है कि यह DDD की नवजात परिपक्वता का संकेत है कि 2 साल तक इसका अध्ययन करने के बाद भी, मैं अभी भी यह वादा नहीं कर सकता कि मुझे इसे करने का "सही तरीका" पता है। सर्वव्यापी भाषा, समग्र जड़ें, और व्यवहार-संचालित डिजाइन के लिए इसका दृष्टिकोण उद्योग में DDD का बहुमूल्य योगदान है। दृढ़ता अज्ञानता और घटना सोर्सिंग भ्रम का कारण बनती है, और मुझे लगता है कि दर्शन इस तरह से इसे व्यापक अपनाने से वापस रखता है। लेकिन अगर मुझे इस कोड को फिर से करना पड़ा, तो जो मैंने सीखा है, मुझे लगता है कि यह कुछ इस तरह दिखाई देगा:
मैं अभी भी इस (बहुत सक्रिय) पोस्ट के किसी भी जवाब का स्वागत करता हूं जो एक मान्य डोमेन मॉडल के लिए कोई भी सर्वोत्तम-व्यवहार कोड प्रदान करता है।
"I don't want to duplicate all my entities into DTOs simply because I don't need it and it violates DRY, and I also don't want my client application to take a dependency on EntityFramework.dll"
। एंटिटी फ्रेमवर्क शब्दजाल में "एंटाइटिस" "डोमेन मॉडल" के रूप में "एंटिटीज" के समान नहीं हैं