如何将Entity(EF)和EntityDTO与Contract(Interface)一起使用
本文关键字:Interface Contract 一起 Entity EF EntityDTO | 更新日期: 2023-09-27 18:28:51
我在DAL中有一个实体(EF),它是由实体框架生成的。
public partial class User : IUser
{
public Guid Id { get; set; }
[Required]
[StringLength(20)]
public string Login { get; set; }
[Required]
[StringLength(25)]
public string Password { get; set; }
[Required]
[StringLength(50)]
public string Email { get; set; }
[StringLength(30)]
public string Lastname { get; set; }
[StringLength(30)]
public string Firstname { get; set; }
[StringLength(200)]
public string Avatar { get; set; }
public Guid? DepartmentId { get; set; }
public Guid? RoleId { get; set; }
public virtual Department Department { get; set; }
public virtual Role Role { get; set; }
}
我在BLL 中创建了UserDto
public class UserDto : IUser
{
public Guid Id { get; set; }
public string Login { get; set; }
public string Password { get; set; }
public string Email { get; set; }
public string Lastname { get; set; }
public string Firstname { get; set; }
public string Avatar { get; set; }
public DepartmentDto Department { get; set; }
public RoleDto Role { get; set; }
public Guid? DepartmentId { get; set; }
public Guid? RoleId { get; set; }
}
为了在DAL和BLL之间传输数据,我使用合同(接口)
public interface IUser
{
Guid Id { get; set; }
string Login { get; set; }
string Password { get; set; }
string Email { get; set; }
string Lastname { get; set; }
string Firstname { get; set; }
string Avatar { get; set; }
}
在这种情况下,如何在DAL和BLL之间传输导航字段?像这样:
public virtual Department Department { get; set; }
public virtual Role Role { get; set; }
如何做得更好:
删除合同(接口)并将用户(EF)直接转移到BLL或建议解决方案以解决此问题。从架构的角度删除合同(接口)是正确的吗
创建DTO最重要的目的是在DAL DTO Model
中丢失DomainModel
那么通过接口将它们再次耦合是完全错误的
我建议您使用与DomainModel相同的EF模型,并在BLL中使用它,除非您有一个大型复杂的项目,否则可以通过拥有真正丰富的DomainModel来更严格地实现DDD。
在这种情况下,您应该将DomainModel
传递给DAL,而不传递其他内容,并且所有映射都应该在DAL的内部。然后您可以使用一些工具,如AutoMapper
或仅手动映射