タスクログシステムがあるとします。タスクがログに記録されると、ユーザーはカテゴリを指定し、タスクはデフォルトで「未処理」のステータスになります。このインスタンスでは、CategoryとStatusをエンティティとして実装する必要があると想定しています。通常、私はこれをします:
アプリケーション層:
public class TaskService
{
//...
public void Add(Guid categoryId, string description)
{
var category = _categoryRepository.GetById(categoryId);
var status = _statusRepository.GetById(Constants.Status.OutstandingId);
var task = Task.Create(category, status, description);
_taskRepository.Save(task);
}
}
エンティティ:
public class Task
{
//...
public static void Create(Category category, Status status, string description)
{
return new Task
{
Category = category,
Status = status,
Description = descrtiption
};
}
}
エンティティがリポジトリにアクセスしてはならないと一貫して言われているので、私はこのようにしますが、これを行うともっと理にかなっています:
エンティティ:
public class Task
{
//...
public static void Create(Category category, string description)
{
return new Task
{
Category = category,
Status = _statusRepository.GetById(Constants.Status.OutstandingId),
Description = descrtiption
};
}
}
ステータスリポジトリはとにかく依存的に注入されるため、実際の依存関係はありません。これは、タスクがデフォルトで未解決になるという決定を下しているのはドメインだと思います。前のバージョンは、その決定を行うアプリケーション層であるように感じます。これが可能性であってはならないのに、リポジトリ契約がドメイン内で頻繁に行われるのはなぜですか?
以下に、より極端な例を示します。ここでは、ドメインが緊急度を決定します。
エンティティ:
public class Task
{
//...
public static void Create(Category category, string description)
{
var task = new Task
{
Category = category,
Status = _statusRepository.GetById(Constants.Status.OutstandingId),
Description = descrtiption
};
if(someCondition)
{
if(someValue > anotherValue)
{
task.Urgency = _urgencyRepository.GetById
(Constants.Urgency.UrgentId);
}
else
{
task.Urgency = _urgencyRepository.GetById
(Constants.Urgency.SemiUrgentId);
}
}
else
{
task.Urgency = _urgencyRepository.GetById
(Constants.Urgency.NotId);
}
return task;
}
}
Urgencyのすべての可能なバージョンを渡す方法はなく、アプリケーション層でこのビジネスロジックを計算する方法もないので、これが最も適切な方法でしょうか。
これは、ドメインからリポジトリにアクセスする正当な理由ですか?
編集:これは、非静的メソッドの場合もあります。
public class Task
{
//...
public void Update(Category category, string description)
{
Category = category,
Status = _statusRepository.GetById(Constants.Status.OutstandingId),
Description = descrtiption
if(someCondition)
{
if(someValue > anotherValue)
{
Urgency = _urgencyRepository.GetById
(Constants.Urgency.UrgentId);
}
else
{
Urgency = _urgencyRepository.GetById
(Constants.Urgency.SemiUrgentId);
}
}
else
{
Urgency = _urgencyRepository.GetById
(Constants.Urgency.NotId);
}
return task;
}
}