मुझे पता है कि आप सोच रहे हैं (या शायद चिल्लाते हुए), "एक और सवाल नहीं पूछ रहा है कि एक स्तरित वास्तुकला में मान्यता कहां है?" खैर, हाँ, लेकिन उम्मीद है कि यह इस विषय पर एक अलग सा होगा।
मैं एक दृढ़ विश्वास है कि मान्यता कई रूप लेती है, संदर्भ-आधारित है और वास्तुकला के प्रत्येक स्तर पर भिन्न होती है। यह पद के लिए आधार है - यह पहचानने में मदद करना कि प्रत्येक परत में किस प्रकार का सत्यापन किया जाना चाहिए। इसके अलावा, एक सवाल जो अक्सर सामने आता है वह यह है कि प्राधिकरण जांच कहां से होती है।
उदाहरण परिदृश्य एक खानपान व्यवसाय के लिए एक आवेदन से आता है। समय-समय पर दिन के दौरान, एक ड्राइवर किसी भी अतिरिक्त नकदी को कार्यालय में बदल सकता है जो ट्रक को साइट से साइट पर ले जाते समय जमा होता है। एप्लिकेशन उपयोगकर्ता को ड्राइवर की आईडी, और राशि एकत्र करके 'कैश ड्रॉप' रिकॉर्ड करने की अनुमति देता है। यहाँ कुछ कंकाल कोड शामिल परतों को चित्रित करने के लिए है:
public class CashDropApi // This is in the Service Facade Layer
{
[WebInvoke(Method = "POST")]
public void AddCashDrop(NewCashDropContract contract)
{
// 1
Service.AddCashDrop(contract.Amount, contract.DriverId);
}
}
public class CashDropService // This is the Application Service in the Domain Layer
{
public void AddCashDrop(Decimal amount, Int32 driverId)
{
// 2
CommandBus.Send(new AddCashDropCommand(amount, driverId));
}
}
internal class AddCashDropCommand // This is a command object in Domain Layer
{
public AddCashDropCommand(Decimal amount, Int32 driverId)
{
// 3
Amount = amount;
DriverId = driverId;
}
public Decimal Amount { get; private set; }
public Int32 DriverId { get; private set; }
}
internal class AddCashDropCommandHandler : IHandle<AddCashDropCommand>
{
internal ICashDropFactory Factory { get; set; } // Set by IoC container
internal ICashDropRepository CashDrops { get; set; } // Set by IoC container
internal IEmployeeRepository Employees { get; set; } // Set by IoC container
public void Handle(AddCashDropCommand command)
{
// 4
var driver = Employees.GetById(command.DriverId);
// 5
var authorizedBy = CurrentUser as Employee;
// 6
var cashDrop = Factory.CreateCashDrop(command.Amount, driver, authorizedBy);
// 7
CashDrops.Add(cashDrop);
}
}
public class CashDropFactory
{
public CashDrop CreateCashDrop(Decimal amount, Employee driver, Employee authorizedBy)
{
// 8
return new CashDrop(amount, driver, authorizedBy, DateTime.Now);
}
}
public class CashDrop // The domain object (entity)
{
public CashDrop(Decimal amount, Employee driver, Employee authorizedBy, DateTime at)
{
// 9
...
}
}
public class CashDropRepository // The implementation is in the Data Access Layer
{
public void Add(CashDrop item)
{
// 10
...
}
}
मैंने 10 स्थानों को इंगित किया है जहाँ मैंने कोड में रखा सत्यापन जाँच देखी है। मेरा प्रश्न यह है कि आप क्या जाँच करेंगे, यदि कोई हो, तो निम्नलिखित व्यवसाय नियमों (प्रत्येक के लिए लंबाई, श्रेणी, प्रारूप, प्रकार, आदि के साथ मानक जाँच के साथ) पर प्रदर्शन कर रहे हैं:
- कैश ड्रॉप की मात्रा शून्य से अधिक होनी चाहिए।
- कैश ड्रॉप में एक वैध ड्राइवर होना चाहिए।
- वर्तमान उपयोगकर्ता को कैश ड्रॉप्स जोड़ने के लिए अधिकृत होना चाहिए (वर्तमान उपयोगकर्ता ड्राइवर नहीं है)।
कृपया अपने विचारों को साझा करें, आपके पास इस परिदृश्य और आपके विकल्पों के कारणों के बारे में कैसे पता चलेगा।
CashDropAmount
का उपयोग कर के बजाय एक मूल्य वस्तु होने से मूल्य वस्तुओं का लाभ उठा सकते हैं Decimal
। यह जाँचना कि चालक मौजूद है या नहीं, कमांड हैंडलर में किया जाएगा और वही प्राधिकरण नियमों के लिए जाता है। आप कुछ ऐसा करके मुफ्त में प्राधिकरण प्राप्त कर सकते हैं, Approver approver = approverService.findById(employeeId)
जहां यह मंजूर नहीं तो कर्मचारी को भूमिका में नहीं। Approver
सिर्फ एक मूल्य वस्तु होगी, एक इकाई नहीं। तुम भी अपने कारखाने से छुटकारा पा सकते थे या बजाय एक एआर पर कारखाना विधि का उपयोग कर सकते हैं cashDrop = driver.dropCash(...)
:।