ฉันรู้ว่าคุณกำลังคิด (หรืออาจจะตะโกน), "ไม่ใช่คำถามที่ถามอีกว่าการตรวจสอบเป็นของสถาปัตยกรรมชั้นหรือไม่?" ใช่แล้ว แต่หวังว่านี่จะเป็นเรื่องที่ต่างออกไปเล็กน้อย
ฉันเชื่อมั่นว่าการตรวจสอบมีหลายรูปแบบตามบริบทและแตกต่างกันไปในแต่ละระดับของสถาปัตยกรรม นั่นเป็นพื้นฐานสำหรับการโพสต์ช่วยระบุประเภทของการตรวจสอบที่ควรดำเนินการในแต่ละชั้น นอกจากนี้คำถามที่มักเกิดขึ้นก็คือการตรวจสอบสิทธิ์
สถานการณ์ตัวอย่างมาจากแอปพลิเคชันสำหรับธุรกิจจัดเลี้ยง ในระหว่างวันผู้ขับขี่อาจเปลี่ยนเป็นเงินสดส่วนเกินที่พวกเขาสะสมไว้ในสำนักงานขณะนำรถบรรทุกจากที่หนึ่งไปยังอีกที่หนึ่ง แอปพลิเคชั่นอนุญาตให้ผู้ใช้บันทึก 'เงินสดลดลง' โดยการรวบรวม ID ของไดรเวอร์และจำนวนเงิน นี่คือรหัสโครงกระดูกบางส่วนเพื่อแสดงเลเยอร์ที่เกี่ยวข้อง:
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
จะเป็นเพียงวัตถุค่าไม่ใช่เอนทิตี นอกจากนี้คุณยังจะได้รับการกำจัดของโรงงานหรือการใช้วิธีการที่โรงงานของคุณบน AR cashDrop = driver.dropCash(...)
แทน: