【发布时间】:2018-01-04 23:22:20
【问题描述】:
我正在开发一个 ASP.NET MVC Web 应用程序。 我目前的架构如下:
Presentation Layer <--> Service Layer <--> Data Access Layer
数据访问层包含 EF 实体模型。 服务层从数据访问层检索 EF 实体模型并返回 DTO。 表示层从服务层检索 DTO,并将 ViewModels 返回给 Views。
我的问题是我应该将什么类传递给驻留在我的服务层中的创建和更新函数。例如:
实体模型:
public class User
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int UserTypeId { get; set; }
public virtual UserType UserType { get; set; }
}
public class UserType
{
public int Id { get; set; }
public string Name { get; set; }
public virtual UserType UserType { get; set; }
}
DTO:
public class UserDTO
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int UserTypeId { get; set; }
//Note this "extra" field
public string UserTypeName { get; set; }
}
服务层功能:
public class UserService: IUserService
{
public UserDTO GetUser(int userId)
{
//The UserType.Name is used a lot, so I'd rather include it in this one db call
//rather than use a separate db call to get the name based on the UserTypeId
return _dbContext.Users.Where(u => u.Id == userId)
.Select(u => new UserDTO
{
Id = u.Id,
FirstName = u.FirstName,
LastName = u.LastName,
UserTypeId = u.UserTypeId,
UserTypeName = u.UserType.Name
}
.First();
}
//??
public void EditUser(UserDTO userDto)
{
//Should I use this? Or EditUser(EditUserDTO editUserDto)...
}
//??
public void EditUser(EditUserDTO editUserDto)
{
//Should I use this? Or EditUser(UserDTO userDto)...
//Note EditUserDTO looks like UserDTO but does not have UserTypeName
}
}
您会发现我的困惑在于使用哪个类作为 EditUser(...) 的参数。
- 如果我使用
EditUser(UserDTO userDto),那么其他开发者将如何 知道他们不需要设置 UserDTO.UserTypeName 吗?他们 只需要设置 UserTypeId。 - 如果我使用
EditUser(EditUserDTO editUserDto),那么开发人员会知道 确切设置哪些信息(EditUserDTO 中的每个属性)。但它是一个额外的类,需要维护、映射和使用。
一些想法:
- 我可以让 DTO 与 Entity 模型完全匹配,但是使用 DTO 有什么意义呢?
- 我可以使用 UserTypeDTO 类作为 UserDTO 的属性,而不是使用“平面”DTO。我认为这会让事情变得更清楚一些,但在调用 EditUser(UserDTO) 时仍然不需要设置它。 附带问题:关于 DTO 是否应该“平坦”是否有任何最佳实践?
- 还有其他想法吗...?
感谢您的帮助!!
【问题讨论】:
标签: c# asp.net-mvc entity-framework mapping dto