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

How to use Entity(EF) and EntityDTO with Contract(Interface)

我在 DAL 中有一个实体 (EF),它是由 Entity Framework 生成的。

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 之间传输数据,我正在使用 Contract(Interface)

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; } 

怎么办比较好:

去掉contract(interface),将User(EF)直接传给BLL,或者建议方案解决这个问题。 从架构的角度移除契约(接口)是否正确?

创建 DTO 的最重要目的是让你的 DomainModel 与你的 DAL DTO Model 失去联系。 那再用一个接口来耦合就完全不对了

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

在这种情况下,您应该将 DomainModel 传递给 DAL,仅此而已,所有映射都应该在 DAL 的 内部 内。您可以使用 AutoMapper 之类的工具或仅手动映射