いくつかの調査を行った後、ほとんどの人が、サービスから取得したエンティティをコントローラーの (ビュー) モデルにマップしていることがわかります。私の意見では、これは実装上の問題を引き起こします。コントローラーは、サービス/ビジネス ロジックではなく、特定のデータの非表示/表示を担当します。たとえば、ユーザー オブジェクトの場合、パスワード フィールドはエンティティ内にあるため、サービス レイヤーからコントローラーに転送され、コントローラーはそれを非表示にする必要があります。
いろいろ考えた結果、別の方法を思いつきました。リポジトリ レイヤーはエンティティを返します。サービス レイヤーでは、エンティティがモデルにマップされ、ViewModel については、モデルを拡張して MVC (検証用) のメタデータを追加する別の部分クラスを作成します。
using System.ComponentModel.DataAnnotations;
[MetadataType(typeof(MyClassMetadata))]
public partial class MyClass
{
private class MyClassMetadata
{
[Required]
public int Id;
[Required]
[StringLength(100)]
public string Name;
}
}
第 2 に、エンティティがリレーショナル エンティティを必要とする場合、たとえば市がデータベースに保存する前に国への参照を必要とする場合、国を添付せずに市をサービスに送り返すのは奇妙です。これにより、国を取得することがコントローラーになります。ただし、私の意見では、これはサービスによって実行されるアクションである必要があります (おそらく、別のサービスまたはリポジトリと組み合わせて)。
上記は一般的なやり方ではないので、何か見落としが気になりますか?上記のように実装すると、(予期しない) 問題が発生しますか?