最初のオプションは適切ではありません。それは循環依存と呼ばれるものであり、それは悪いことです。
2番目のオプションの方が優れていますが、それでも優れていません。モデルクラスには、間違いなく、UIにのみ適用できるフィールドとメソッドがあります。これらは、データオブジェクトがWeb層に属している以上、データレイヤーに属していません。これは結合の例であり、関心の分離が不十分であることとしても知られていますが、これも悪いことです。
最良のオプションは、両方の層で必要なデータを別個のクラスのセット(dto(データ転送オブジェクト)またはpoco(プレーンな古いクラスオブジェクト)と呼ばれることもあります)に分離することです。これらのクラスは、ニーズに応じて、データプロジェクトまたはプロジェクト全体に常駐できます。サービスがWCFサービスに存在する場合、これらのクラスは通常DataContractsになります。次に、MVCプロジェクト内に、現在のモデルが必要ですが、独自のデータを保持するのではなく、POCOへの参照が含まれている必要があります。したがって、特定のケースでは、データプロジェクトにRegistrationInfoクラス(またはそれを呼び出したいもの)を作成し、RegistrationInfoタイプのフィールドをモデルに追加して、RegistrationModel全体ではなくサービスに渡します。
編集:例を追加
namespace MyProject.Data.Objects {
public class RegistrationInfo {
[Required]
public string Username { get; set; }
[Required]
public string Password { get; set; }
[Required]
public string Email { get; set; }
}
}
namespace MyProject.Data {
public class MyService {
public TblUser Register(RegistrationInfo info) {
// .. save to the database ..
}
}
}
namespace MyProject.UI.Models {
class RegistrationModel {
public RegistrationInfo Info { get; set; }
/* Fields which the ui needs but the database does not */
public bool ConfirmPassword { get; set; }
public bool AllowFreeEmailAddresses { get; set; }
public void Save() {
new MyProject.Data.MyService().Register(this.Info);
}
public RegistrationModel() {
this.Info = new RegistrationInfo();
}
}
}