所以我有DAO,DTO和BO。结果如下:
// Instantiate a new user repository.
UserRepository rep = new UserRepository();
// Retrieve user by ID (returns DTO) and convert to business object.
User user = rep.GetById(32).ToBusiness<User>();
// Perform business logic.
user.ResetPassword();
user.OtherBusinessLogic("test");
user.FirstName = "Bob";
// Convert business object back to a DTO to save to the database.
rep.Save(user.ToDataTransfer<Data.DTO.User>());
所以我试图分开关注点,但我想摆脱这段代码中的“转换”。 “转换”实际上位于业务逻辑层(DTO层不知道业务逻辑层)作为扩展对象。 DTO本身显然只存储数据,并且没有任何业务逻辑。 UserRepository调用DAO,在GetById结束时使用AutoMapper从DAO映射到DTO。 “转换”(ToBusiness和ToDataTransfer)完全按照他们的说法行事。
我的一位同事认为我可能需要一个商业资源库,但认为它可能有点笨拙。有什么想法吗?
答案 0 :(得分:8)
我唯一的混淆来源是为什么需要拨打ToBusiness<User>()
和ToDataTransfer<Data.DTO.User>()
。
存储库的职责是处理数据管理。它应该隐藏实现细节(以及Business Objects和Data Objects之间的转换)。
UserRepository
应该返回User
而不需要任何转换。
UserRepository
也应该能够持续User
而无需投射。
如果在存储库中处理所有转换并且您的代码读作:
,代码将更加清晰UserRepository rep = new UserRepository();
User user = rep.GetById(32);
// Do Work Here
rep.Save(user);
答案 1 :(得分:1)
这是我第一次看到DTO被转换为BO,我通常发送 DTO以供BO类或方法使用。当BO完成并希望保存对DTO的修改时,它会将其发送到DAL并使其保持不变。