データベース エンティティをモデルにマッピングし、ビジネス ロジックを実行する際のベスト プラクティスは何ですか? 私は両方のかなり異なる実装を見てきました。リポジトリ (データ層内) 自体がデータベース エンティティをドメイン モデルにマッピングする役割を果たしている多くの実装に気付きました。たとえば、これを行うリポジトリは次のとおりです。
public IQueryable<Person> GetPersons()
{
return DbSet.Select(s => new Person
{
Id = s.Id,
FirstName= s.FirstName,
Surname= s.Surname,
Location = s.Location,
});
}
しかし、N 層設計の SO を包括的に検索した結果、特効薬はありませんが、ほとんどの場合、MVC プロジェクトのコントローラー内で手動またはマッパーを使用してマッピングを実行することをお勧めします。また、サービス層はマッピングを実行してはならず、ビジネス ロジックを実行する責任があることも繰り返し述べられています。ここでいくつか質問があります:
- エンティティをモデルに、またはその逆にマップする場所に関して、どの方法が適切ですか? リポジトリでこれを行う必要がありますか、それともコントローラーでマッピングを行う必要がありますか?
- データベースから取得したエンティティに対して何らかのビジネス ロジックを実行したいとします。たとえば、エンティティの完全な名前を返したり、すべての の年齢を 10 年
Person
増やしたりします。この操作はどこで実行する必要がありますか。Person
モデル自体に?たとえばFullName
、フルネームと年齢を計算するモデルにプロパティがありますか? それとも、ビジネス ロジックを実行するために、サービス レイヤー内に何らかのサービスを定義する必要がありますか?
編集
うわー、非常に多くの接近票。申し訳ありませんが、私は十分に包括的に検索していませんでした。ここで提起した「ビジネス ロジックを実行する場所」の問題は、すでに SO やその他の場所で見つけることができます (ときどき不可解に伝えられますが)。
コントローラーのビジネス ロジックを MVC のどこに置くべきか
しかし、私が持っていたマッピングの質問に対する標準的な解決策をまだ見つけていません。おそらく私の質問をもっと雄弁に表現できたと思います。そのため、一般的なコンセンサスは、ビジネス ロジックはサービス レイヤーに入り、ドメイン モデルからビュー モデルへのマッピングはコントローラー/プレゼンテーション レイヤーで行う必要があるということです。また、DB エンティティをデータ レイヤー以外のレイヤーに表示しないことをお勧めします。手動で、または Auto Mapper などのマッパーを使用して、エンティティをデータ レイヤーのドメイン モデルにマップすることをお勧めします (これは私が収集したものです)。多くの記事を読む)。私の混乱は、エンティティをドメイン モデルにマッピングし、ドメイン モデルをビュー モデルにマッピングする場所に関する疑問から生じました。しかし、以前にほのめかしたように、質問をもっと明確に表現できたはずです。