我有一个RentalProperty类,看起来像这样:
class RentalProperty
{
Money MonthlyRent;
List<MaintainenceCall> MaintainenceCalls;
}
根据我的理解,使用DDD更改MonthlyRent,我将获得RentalProperty,更改MonthlyRent属性,并调用RentalPropertyRepository.Save()。将处理相同的过程以添加新的MaintainenceCall。
我遇到的问题是,例如,Handyman应该能够添加MaintainenceCall,但不应该允许更改MonthlyRent。我该如何实施这个(以及其他类似的)安全策略?
答案 0 :(得分:11)
简而言之,您应该直接在模型中应用此业务规则。在您的情况下,直接在MonthlyRent getter和setter属性中。我们都知道,通过大量检查和安全级别可以获得多么复杂的结果;所以,这就是规格的目的。
DDD手册引入了规格的概念,正是为了将光线集中在模型本身上。首先如上所述设置getter和setter以获得功能。然后,在重构期间,通过将long getter / setter代码抽象为Specification类来寻找使模型更清晰。
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.");
}
阅读代码可以清楚地了解代码的作用。这本身就是核心DDD概念。规格应该保持非常简单,直接。
此代码来自Domain-Driven Design Quickly,这是对DDD的简短快速阅读。它真的是一本关于DDD的短小书,可以保证阅读几个小时。只有100页左右。
答案 1 :(得分:4)
AOP。对于像这样的东西,PostSharp非常光滑。
因为安全确实是一个贯穿各领域的问题。