我有以下设计: My Design My Design http://s15.postimg.org/3zha8rzqh/Design_Idea.png
我的服务层(左侧服务)中会有一个名为“ProductDTO”的课程。
当调用“更新产品(ProductDTO)”操作合同时 - 它应该在业务逻辑层中调用“更新产品”功能。
在数据库('数据访问层')中有一个名为'Product'的实体,因为我使用LINQ-To-Entities,我还会有一个名为'Product'的类
我的问题是 - 我从哪里可以将'ProductDTO'翻译成'产品'?
我应该在服务层中使用'Translate_ProductDTO_To_Product'功能吗? 这似乎是最正确的答案,因为这是唯一知道'ProductDTO'是什么的层。
但这意味着服务层还必须知道“产品”是什么,因此必须引用数据访问层程序集。
这是对的吗?
我认为服务层应该只引用业务逻辑层,并且业务逻辑层应该只引用数据访问层,服务层应该对DAL一无所知。
答案 0 :(得分:2)
您的混淆似乎源于假设数据层中的Product
类实际上是Product
实体。通常在domain driver design中,您的业务实体是/业务逻辑层。通常这些类是“无知”的持久性,这是数据访问层的责任(通常使用对象关系映射器框架)。
实际上,您的服务需要引用域模型(业务层)和数据访问层才能执行有用的工作。 WCF服务代码和数据访问层都应该依赖于域模型,但域模型不应该依赖于数据访问层或WCF服务代码。
答案 1 :(得分:1)
将DTO映射到服务层中的域实体。您的服务层需要了解DTO及其映射到(和)的实体。我强烈建议您使用像AutoMapper这样的工具来进行映射而不是手工制作。 您的服务层不应引用您的DA层(或程序集)。您的BL以后需要引用您的DA层来保留实体。 编辑: 您的业务参与者可能不应该在DA命名空间下。如果您使用ORM工具生成它们,请确保将任何DDD逻辑放在部分类的另一半中。