谢谢你的任何想法。
我正在尝试学习 MVC 架构,并在一个小项目上工作,这与我学习该工具的重要性不亚于项目的要求。
我需要弄清楚什么是好的、可接受的和不好的做法,以及为什么。我完全理解不会有具体的正确答案,但必须有适合任何好 -> 坏范围的架构。虽然从某种意义上说不仅仅是一个问题,但我希望良好设计实践的逻辑流程意味着它们都与一个单一的封装答案相关联。
我正在使用Darko Pečnik 的Code First Membership 提供程序
User 实现了一个接口 IUser ,它隐藏了许多属性,例如主键和密码,应该通过属于 Membership 类的方法来访问/更改这些属性。它还对字符串数组使用 getter 和 setter,而不是通过以下方式使用 User.Roles 集合:
public virtual String[] RoleNames
{
set
{
this.Roles = (ICollection<Role>)value.Select(r =>
new Role { RoleName = r }).ToList();
问题 1.) 我怀疑这个属性可能是不好的做法,但我不确定具体原因。这些作为 GetRoleNames 和 SetRoleNames 方法会更好,还是 Icollection 本身会更好地包含在 IUser 接口中?
存在两个单独的 viewModel,它们使用 AutoMapper 从 IUser 映射。这些模型与用户是自己注册/更新有关他们的详细信息,还是由网站管理员注册/更新有关。
一个视图模型包含角色和部门的 IEnumerable。这些属性当前正在通过 automapper 进行映射:
internal class RoleStringArrayToSelectListResolver
: ValueResolver<String[], IEnumerable<SelectListItem>>
{
protected override IEnumerable<SelectListItem> ResolveCore(String[] source)
{
return Roles.GetAllRoles().Select(x => new SelectListItem
{
Value = x,
Text = StringExtensions.ToSeparatedWords(x),
Selected = source.Contains(x)
问题 2.) autoMapper 是一个可以接受的放置这种逻辑的地方吗?如果不是,它应该放在哪里?
问题 3.) 回发后,业务逻辑通过存储库方法 createUser 和 updateUser 进行验证。这些方法接受 IUser 实例作为参数是否是最佳选择,或者对于接受各种视图模型作为参数的几个重载来说更可取,如果是,为什么?
非常感谢您提出任何想法并帮助我理解。