如何将 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
之类的工具或仅手动映射
我在 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
之类的工具或仅手动映射