WCF服务和实体框架n层应用程序问题

时间:2012-03-12 12:49:38

标签: wcf entity-framework n-tier-architecture

我正在开发WCF服务,它是更大系统的一部分。该服务将提供一些业务逻辑,并将通过实体框架(使用模型优先)连接到数据库。我看到有许多不同的方式将实体框架与WCF服务(基本实体,DTO,自我跟踪实体,POCO等)联系起来。我的基本要求:

  • 该服务是为瘦客户端(和其他服务)构建的,大多数逻辑都在它的​​一边,因此它不是任何CRUD应用程序(WCF数据服务不适合我)
  • 不同的客户端需要具有不同粒度级别的数据,因此对于数据库中的同一实体,将有不同的数据合同

由于我的要求,我的愿景是如何构建的最接近(我认为它是最接近DTO的方法): http://www.codeproject.com/Articles/127395/Implementing-a-WCF-Service-with-Entity-Framework

但我认为数据访问层应该与服务的逻辑分开(2个程序集:项目,命名空间,dll,但作为一个应用程序工作)。在这种情况下,我有一些问题应该是这两个层中的每一个应该做什么:是否应该在服务中完成所有逻辑并且DAL将仅用作CRUD?或者Service应该只负责明确的业务逻辑,而整个数据库逻辑(使用linq的特定查询)将在DAL中完成(DAL公开的许多更具体的方法)?同样重要的是,应该将这些对象发送到这两层:数据合同,实体还是其他模型?

在我提到的情况下,我的方法是否正常?

1 个答案:

答案 0 :(得分:1)

在SOA之前,N层或3层体系结构通常具有专用的业务层。如果您对关注点分离感到强烈(或者如果您认为可能会从非服务使用者那里重用业务功能),为什么不将业务逻辑从服务层移出? (但不要将业务逻辑放在DAL中)

但是,如果您的服务层确实提供数据查询服务以及事务性服务,那么这些服务不需要业务层 - 请在此处查看CQRS类型设计模式。

如果您需要控制实体的XML格式(Names,xmlns等),您可能需要构建自定义WCF DataContract或MessageContract实体。 但是,如果您不关心数据在整个线路中的样子,您可以简单地使用EF实体类(只要它们不是上下文绑定的 - 即如果使用带有EF的POCO)。如果您没有将POCO归因于DataContract等,则DataContractSerializer的默认行为是序列化公共属性。

所以你最终可以使用以下装配'层'(自下而上)

  • EF的DAL实体(ObjectContext bound或POCO)
  • EF DAL
  • 业务层(仅限交易服务方法 - 绕过查询)
  • 可能将您的POCO / DAL BE映射到DataContract / MessageContract的WCF实体分开
  • WCF服务层