貧血ドメインモデル(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
...純粋なオブジェクト指向プログラミングの観点からの動作の欠如?
いくつかの言葉
私の意見では、アスペクト指向プログラミングには、ドメイン(または他のレイヤー)のメインフローに多くの詳細を隠すという欠点がありますが、オブジェクト指向とアスペクト指向の背後にある概念の鳥瞰図です。アプローチは、アネミックドメインモデルではなく、リッチドメインモデルにマッピングされます。