用于返回由多个存储库创建的对象的模式
本文关键字:创建 对象 模式 存储 返回 用于 | 更新日期: 2023-09-27 18:24:04
和以往一样,我一直在寻找编写更好程序的模式。最近我花了一些时间在定制Repositories
和DTO
上。一切都很好,但我有一个场景,因为我有三个DTO's
:
- 代币
- 用户
- 生物
和三个存储库(映射到DTO)
- TokenRepository
- 用户存储库
- BioRepository
现在,如果用户"A"提出请求,然后调用GetUserByCredentials(User user);
我想制作一个物体——也许是UserFacade
?它具有所有三个表/Obj的属性。
那么,基本上我应该考虑的最佳方法或模式是什么?
值得注意的是,DTO
之间没有任何关系。
我觉得从长远来看,这将保持我所有的存储库/DTO's
的清洁。
//编辑
只是为了澄清数据库中包含的关系。我不会将tbl_User作为EF构建的对象返回,而是在不使用代码优先/自动映射器等的情况下将其映射到DTO
例如(旧方法):
public User GetUser(string email, string password)
{
var user = context.tbl_User
.Where(u => u.Email == email && u.Password == password)
.Select(y => new User
{
UserID = y.UserID,
Email = y.Email,
Password = y.Password,
Token = y.tbl_Token
.Where(x => x.UserID == y.UserID)
.Select(z => z.TokenName).FirstOrDefault(),
ProfilePic = y.tbl_Bio.Where(t => t.UserID == y.UserID).Select(p => p.Avatar).FirstOrDefault(),
RoleID = y.RoleID
}).FirstOrDefault();
return user;
}
理想情况下,我想去掉Token和ProfilePic,因为这些属性已经存在于自己的类(DTO)中
我希望我没有太多考虑模式哈哈
谢谢你抽出时间!
问候,
我通常使用存储库在Aggregate Roots
上运行。
Martin Fowler将聚合根定义为
可以作为单个单元处理的域对象的集群
在这种情况下,User
将是您的聚合根,Token
和Bio
将是User
的属性。
这样,当您需要更改Bio
或Token
时,您将通过UserRepository
进行更改