আমি জানি আপনি ভাবছেন (বা শুনে চিত্কার করছেন), "অন্য কোনও প্রশ্ন জিজ্ঞাসা করছে না যে স্তরযুক্ত আর্কিটেকচারের মধ্যে বৈধতা কোথায়?!?" আচ্ছা, হ্যাঁ, তবে আশা করি বিষয়টির বিষয়ে এটি একটু আলাদা হবে।
আমি দৃ firm় বিশ্বাসী যে বৈধতা অনেকগুলি রূপ নেয়, প্রসঙ্গ ভিত্তিক এবং স্থাপত্যের প্রতিটি স্তরে পরিবর্তিত হয়। এটি পোস্টের ভিত্তি - প্রতিটি স্তরে কী ধরণের বৈধতা কার্যকর করা উচিত তা সনাক্ত করতে সহায়তা করে। তদতিরিক্ত, একটি প্রশ্ন যা প্রায়শই আসে যা হ'ল অনুমোদনের চেকগুলি কোথায়।
ক্যাটারিং ব্যবসায়ের জন্য অ্যাপ্লিকেশন থেকে উদাহরণের দৃশ্যপট আসে। সময়ে সময়ে, কোনও চালক অফিস থেকে সাইটে ট্রাকে তুলতে গিয়ে যে কোনও অতিরিক্ত নগদ জোগাড় করে অফিসে যেতে পারেন। অ্যাপ্লিকেশনটি ব্যবহারকারীর ড্রাইভারের আইডি এবং পরিমাণ সংগ্রহ করে 'নগদ ড্রপ' রেকর্ড করতে দেয়। জড়িত স্তরগুলি চিত্রিত করার জন্য এখানে কিছু কঙ্কাল কোড রয়েছে:
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(...)
।