2009-03-09 7 views
5

मैं एक RentalProperty वर्ग जो कुछ इस तरह दिखता है:DDD उपयोगकर्ता सुरक्षा नीतियां

class RentalProperty 
{ 
    Money MonthlyRent; 
    List<MaintainenceCall> MaintainenceCalls; 
} 

मेरी समझ से, DDD का उपयोग कर MonthlyRent बदलने के लिए, मैं RentalProperty मिलेगा, MonthlyRent संपत्ति बदलने के लिए, और RentalPropertyRepository फोन ।बचाना()। एक नई प्रक्रिया को एक नया रखरखाव कॉल जोड़ने के लिए संभाला जाएगा।

मेरी समस्या यह है कि, उदाहरण के लिए, एक हैन्डमैन एक रखरखाव कॉल जोड़ने में सक्षम होना चाहिए, लेकिन मासिक मार्ग बदलने की अनुमति नहीं दी जानी चाहिए। मुझे इसे (साथ ही साथ अन्य समान) सुरक्षा नीति को कैसे कार्यान्वित करना चाहिए?

+0

शायद मैं वास्तव में आपके जैसा ही मूल प्रश्न पूछ रहा हूं लेकिन मैंने पहले एक अलग दिशा में उतरना शुरू कर दिया है। http://stackoverflow.com/questions/5374176/can-ddd-repositories-be-aware-of-user-context – jpierson

उत्तर

2

एओपी। PostSharp इस तरह की चीजों के लिए वास्तव में चालाक है।

क्योंकि सुरक्षा वास्तव में एक क्रॉस-काटने की चिंता है।

+0

दिलचस्प है, क्योंकि मैं इस अवधारणा को भी कुश्ती कर रहा हूं। +1 – eduncan911

+1

सुरक्षा लॉगिंग जैसी कुछ चीज़ों के रूप में स्पष्ट रूप से क्रॉस-कटिंग चिंता नहीं है। जब लॉगिंग की बात आती है, तो केवल एक चीज जो इकाइयों में भिन्न होती है वह लॉग हो जाती है। उपयोगकर्ता को कुछ करने के लिए अधिकृत किया गया है या नहीं, डोमेन के भीतर विशिष्ट जानकारी पर निर्भर हो सकता है। –

8

संक्षेप में, आपको सीधे अपने मॉडल में इस व्यवसाय नियम को लागू करना चाहिए। आपके मामले में, मासिक मासिक गेटटर और सेटर संपत्ति में सीधे। हम सभी जानते हैं कि कितने जटिल हैं जो बहुत से चेक और सुरक्षा स्तर के साथ मिल सकते हैं; तो, यही विनिर्देश हैं।

डीडीडी प्लेबुक विनिर्देशों की अवधारणा को प्रस्तुत करता है, मॉडल के प्रकाश पर ध्यान केंद्रित करने के इस उद्देश्य के लिए। कार्यक्षमता प्राप्त करने के लिए आप ऊपर वर्णित अपने गेटर और सेटर को पहले सेट अप करते हैं। फिर, अपने रिफैक्टरिंग के दौरान, विशिष्टता कक्षाओं में लंबे गेटर/सेटर कोड को सारण करके मॉडल क्लीनर बनाने के लिए देखें।

Employee employee = 
    employeeRepository.findEmployee(employeeID); 

Specification employeeCanModifyRent = new 
    Specification(
     new EmployeeHasAccessToManagement() 
     , new EmployeeHasAccessToMoney()); 

if(employeeCanModifyRent.isSatisfiedBy(employee)) 
{ 
    rentService.changeRent(); 
} 
else 
{ 
    throw new exception("Access denied."); 
} 

कोड पढ़ना यह बिल्कुल स्पष्ट करता है कि कोड क्या करता है। यह स्वयं में मूल डीडीडी अवधारणा है। निर्दिष्टीकरण बहुत सरल, और सीधे आगे रखा जाना चाहिए।

यह कोड Domain-Driven Design Quickly से आता है, जो जल्दी से डीडीडी के लिए एक संक्षिप्त और त्वरित पढ़ा जाता है। यह वास्तव में डीडीडी पर एक छोटी-छोटी-छोटी किताब है जो कुछ घंटों में पढ़ने की गारंटी देती है। बस 100 पेज या तो।