私は、MVCの懸念の分離のための「適切な」構造は、あなたのビューを構造化し、選択したリポジトリに永続化するためのデータモデルを分離するためのビューモデルを持つことです。私はMongoDBを試し始めました。スキーマレスのNO-SQLスタイルのデータベースを使用する場合、これが当てはまらないと思っています。私はこのシナリオをstackoverflowコミュニティに提示し、皆の考えが何であるかを見たいと思っていました。私はMVCに新しいので、これは私には意味がありましたが、多分私は何かを見落としているかもしれません...MVCとNOSQL:ビューモデルをMongoDBに直接保存しますか?
これは私の例です:ユーザーがプロファイルを編集したいとき、ユーザー編集ビューは、以下のUserEditモデルを使用します。
public class UserEditModel
{
public string Username
{
get { return Info.Username; }
set { Info.Username = value; }
}
[Required]
[MembershipPassword]
[DataType(DataType.Password)]
public string Password { get; set; }
[DataType(DataType.Password)]
[DisplayName("Confirm Password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
[Required]
[Email]
public string Email { get; set; }
public UserInfo Info { get; set; }
public Dictionary<string, bool> Roles { get; set; }
}
public class UserInfo : IRepoData
{
[ScaffoldColumn(false)]
public Guid _id { get; set; }
[ScaffoldColumn(false)]
public DateTime Timestamp { get; set; }
[Required]
[DisplayName("Username")]
[ScaffoldColumn(false)]
public string Username { get; set; }
[Required]
[DisplayName("First Name")]
public string FirstName { get; set; }
[Required]
[DisplayName("Last Name")]
public string LastName { get; set; }
[ScaffoldColumn(false)]
public string Theme { get; set; }
[ScaffoldColumn(false)]
public bool IsADUser { get; set; }
}
UserEditModelクラスがIRepoDataから継承するのUserInfoのインスタンスが含まれていることに注意してください? UserInfoはデータベースに保存されるものです。私はIRepoDataフォームを継承し、それを保存するオブジェクトを受け入れるジェネリックリポジトリクラスを持っています。だから私はRepository.Save(myUserInfo)
と呼んでいるだけです。 IRepoDataは_id(MongoDB命名規則)とタイムスタンプを定義するので、リポジトリは_idに基づいてアップサンプリングし、タイムスタンプに基づいて競合をチェックし、オブジェクトがMongoDBに保存された他のプロパティをチェックできます。ほとんどの場合、ビューは@Html.EditorFor
を使用する必要があり、私たちは行かなくてはなりません!基本的には、ビューの必要性だけがベースモデルに入り、リポジトリだけが必要とするものは[ScaffoldColumn(false)]
アノテーションを取得し、その他はすべて共通です。 (BTW - 彼らはのUserInfoオブジェクトに含まれていない理由があるので、ユーザー名、パスワード、役割、および電子メールは、.NETプロバイダに保存されます。)
大きな利点このシナリオのが2つある...
は、私は(私の意見では)ので、より簡単に速く開発し、理解し、そしてより保守である少ないコードを、使用することができます。
私ができる再ファクター秒で...私は2番目のメールアドレスを追加する必要がある場合、私はちょうどのUserInfoオブジェクトに追加するには - それがビューに追加し、追加するだけで、リポジトリに保存されますオブジェクトに1つのプロパティ。 MongoDBを使用しているため、dbスキーマや既存のデータを変更する必要はありません。
この設定では、データを格納するための別のモデルを作成する必要がありますか?このアプローチの欠点は何だと思いますか?明らかな答えは基準と分離の問題ですが、現実世界の例がありますが、これが原因で頭痛の一部が現れると思いますか?
私は2人の開発者からなるチームに取り組んでいることにも留意する価値があるので、いくつかの基準の妥協点を見落とすのは簡単です。あなたは小さなチームで働くことがその点で違いを生むと思いますか?
私は基本的に同意します。 5番目のパラグラフでは、モデルバインディングが問題の原因であることを指摘する必要があります(つまり、正しい名前のすべてのフィールドがバインドされます)。モデルバインディングは、特定のフィールドを無視するように設定することもできます。それは危険です。マッピングコードは退屈でエラーが発生しやすいため、AutoMapperはViewModelとのマッピングに適しています。 – mnemosyn
ああ、私はそれを追加します。 automapperは、手動で行うのではなく、ビューモデルとのやりとりを行うためのより良いソリューションだと私は同意します。 – KallDrexx
うわー、私のためによく書かれた答えを作る時間をとってくれてありがとう! – jrizzo