关注点分离 - DAO,DTO和BO

时间:2010-01-19 20:18:28

标签: c# java .net domain-driven-design business-objects

所以我有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)完全按照他们的说法行事。

我的一位同事认为我可能需要一个商业资源库,但认为它可能有点笨拙。有什么想法吗?

2 个答案:

答案 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并使其保持不变。