【发布时间】:2011-06-27 19:37:29
【问题描述】:
我了解 MVC 中关注点分离的“正确”结构是拥有用于构建视图的视图模型和用于持久保存在所选存储库中的单独数据模型。我开始尝试使用 MongoDB,并且开始认为这在使用无模式、NO-SQL 样式的数据库时可能不适用。我想把这个场景展示给 stackoverflow 社区,看看大家的想法。我是 MVC 的新手,所以这对我来说很有意义,但也许我忽略了一些东西......
这是我的讨论示例:当用户想要编辑他们的个人资料时,他们会转到 UserEdit 视图,该视图使用下面的 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)] 注释,其他一切都是两者之间的共同点。 (顺便说一句 - 用户名、密码、角色和电子邮件被保存到 .NET 提供商,因此它们不在 UserInfo 对象中。)
此方案的巨大优势有两个...
我可以使用更少的代码,因此更容易理解、开发更快且更易于维护(在我看来)。
我可以在几秒钟内重新考虑...如果我需要添加第二个电子邮件地址,我只需将其添加到 UserInfo 对象 - 它会添加到视图中并保存只需向对象添加一个属性即可将其添加到存储库。因为我使用的是 MongoDB,所以我不需要更改我的数据库架构或弄乱任何现有数据。
鉴于此设置,是否需要制作单独的模型来存储数据?大家认为这种方法的缺点是什么?我意识到显而易见的答案是标准和关注点分离,但是您是否有任何现实世界的例子可以证明这会导致一些令人头疼的问题?
另外值得注意的是,我正在一个由两名开发人员组成的团队中工作,因此很容易看到好处并忽略了一些标准的弯曲。您认为在较小的团队中工作在这方面会有所不同吗?
【问题讨论】:
标签: asp.net-mvc mongodb separation-of-concerns