我有一个RentalProperty类,如下所示:
class RentalProperty
{
Money MonthlyRent;
List<MaintainenceCall> MaintainenceCalls;
}根据我的理解,使用DDD更改MonthlyRent时,我将获得RentalProperty,更改MonthlyRent属性,然后调用RentalPropertyRepository.Save()。添加新的MaintainenceCall也需要处理相同的过程。
我的问题是,例如,杂工应该能够添加MaintainenceCall,但不应该被允许更改MonthlyRent。我应该如何实现这个(以及其他类似的)安全策略?
发布于 2009-03-09 20:58:06
AOP。对于这样的东西,PostSharp真的很灵巧。
因为安全确实是一个跨领域的问题。
发布于 2009-03-20 03:40:05
简而言之,您应该在模型中直接应用此业务规则。在您的例子中,直接在MonthlyRent的getter和setter属性中。我们都知道,通过大量的检查和安全级别,这可能会变得多么复杂;所以,这就是规范的目的。
DDD攻略引入了Specifications,的概念,正是出于这个目的,将重点放在了模型本身上。首先像上面描述的那样设置getter和setter来获得功能。然后,在重构过程中,通过将长的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页左右。
https://stackoverflow.com/questions/627945
复制相似问题