假设您有一个贫血的域模型 (ADM):
public class Employee
{
public Employee()
{
_roles = new List<Role>();
}
private IList<Role> _roles;
public Guid Id { get; set; }
public string Name { get; set; }
public IList<Roles> Roles { get { return _roles; } }
}
public class EmployeeManager
{
public Employee GetByName(string name)
{
Contract.Requires(name != null);
return repositoryOfEmployeesInstance.GetByName(name);
}
public void AddEmployee(string name)
{
Contract.Requires(name != null);
// The unique identifier will be generated by the OR/M behind the scenes...
repositoryOfEmployeesInstance.Add(new Employee { Name = "Matias" });
}
}
后来,在其他地方,你有这个代码:
Employee some = new EmployeeManager().GetByName("Matias");
some.Roles.Add("Principal");
现在,除了领域模型之外,还有一个称为的方面DomainValidationAspect
,它在新员工将要在实现中持久化之前对其进行验证Repository
。
整体ValidateEmployeeAspect
可以在添加或更新时验证一个Employee
,这是添加角色的情况。它负责加载Employee
的域规则并对其进行验证。域规则是使用规范模式实现的。
最后,一切都发生在域事务中。
是的,从面向对象编程的角度来看,它似乎是一个贫乏的领域模型,但面向方面的编程呢?
所以问题是...
...可能只是因为:
- ...在这种情况下,
Employee
使用集合接口添加角色? Employee
...从纯面向对象编程的角度来看,没有行为?
一些单词
我的观点是,面向方面的编程确实存在在领域(或任何其他层)的主要流程中隐藏大量细节的缺点,但是对面向对象和面向方面背后的概念进行了鸟瞰方法将映射到丰富的域模型而不是贫乏的域模型。