如何将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或建议解决方案以解决此问题。从架构的角度删除合同(接口)是正确的吗

如何将Entity(EF)和EntityDTO与Contract(Interface)一起使用

创建DTO最重要的目的是在DAL DTO Model中丢失DomainModel那么通过接口将它们再次耦合是完全错误的

我建议您使用与DomainModel相同的EF模型,并在BLL中使用它,除非您有一个大型复杂的项目,否则可以通过拥有真正丰富的DomainModel来更严格地实现DDD。

在这种情况下,您应该将DomainModel传递给DAL,而不传递其他内容,并且所有映射都应该在DAL的内部。然后您可以使用一些工具,如AutoMapper或仅手动映射