我有一个领域驱动设计应用程序,它链接来自不同社交网络的用户配置文件。例如,假设是 Facebook 和 Twitter。 API 返回 User 对象。这些 User 对象是自定义 RegisteredUser 所必需的,也就是说,在某些方法中,同时使用 Twitter.User 和 Facebook.User。
我使用存储库服务模式,不使用 EF。决定在域中创建 TwitterUser 和 FacebookUser。此外,创建 TwitterUserDto 和 FacebookUserDto 是为了与数据库通信,因为 DTO 的结构略有不同,以便正确工作和维护数据库结构。
例如:
public class TwitterUser
{
public long Id { get; set; }
public string FirstName { get; set; }
public string Username { get; set; }
}
public class TwitterUserDto
{
public required long Id { get; set; }
public required string FirstName { get; set; }
public required string Username { get; set; }
public required DateTime AddedAt { get; set; }
}
问题是库方法需要自己的User(Facebook.User、Twitter.User),需要转换对象。服务使用域中定义的对象(TwitterUser、FacebookUser),存储库使用 DTO(TwitterUserDto、FacebookUserDto)。结果,即使是简单的代码也会变得一团糟。
有必要使用DTO吗?如何正确组织项目中的模型以及应用程序各层的交互?
首先,你可以尝试使用 Automapper 将映射分离到另一个类中。
其次,Jimmy Bogard 说“将类放在靠近实际使用的地方。”。它符合 这个关于 DDD 的伟大答案:
将 DTO 定义为值来源所在的图层。