公开Rich Domain Objects作为服务

时间:2009-02-11 08:42:40

标签: web-services domain-driven-design mvp n-tier-architecture

我一直试图将我的域对象暴露给客户端。无论我是使用富客户端还是使用网络,我都希望使用MVP和存储库模式。

我试图解决的是我如何公开我的存储库和模型,它将在服务器上。是否有可能通过Web服务公开具有状态的复杂业务对象,或者我是否必须使用非语言/平台无关的专有技术,如.Net远程处理,EJB,COM +,DCOM等?

其他一些限制因素是,我不希望每次要执行操作时都必须继续从数据库加载复杂域对象或将其传递到整个线路。一些复杂的逻辑可能是基于用户权限以及对象的状态,屏幕的某些区域可能被禁用或不可见。还需要向用户显示验证和错误消息信息。我希望能够在逻辑上调用我的很多域对象操作,就好像它在同一台机器上运行一样。

通过网络,您可以自由发挥。您不必跨服务边界公开您的对象,因此您可以根据需要使它们变得丰富。我正在尝试创建一个非常丰富的N-teir架构,当调用模型的客户端位于不同的机器上时可以正常工作。

3 个答案:

答案 0 :(得分:2)

您可以通过REST或Web服务公开您的域对象,就像任何其他对象一样。我认为关键是要了解您必须在一次调用中公开提供业务价值的服务,而这些服务并不一定以1:1的方式映射到您的存储库。因此,虽然您在服务器上可能希望单个服务调用使用多个存储库并执行各种聚合,但您在任何类型的Web服务上公开的内容应该或多或少是完整的结果。您在服务上公开的操作不应公开单个存储库,而应关注提供给定业务值的有意义的操作。

我希望这会有所帮助。

答案 1 :(得分:2)

您可以使用SOAP格式化程序进行.Net远程处理, 但由此产生的服务可能很难 作为一种服务消费,它将非常健谈。

如果您希望将您的域模型作为服务使用,则应将其设计为服务。

如域驱动设计中所述,服务是无状态的,因此它不会直接暴露您的对象。您的服务应该公开提供有意义的业务操作的方法,这些操作将作为一个单元执行。

通常认为客户端中的模型位于不同的有界上下文中,因为它的关注点与服务器上的模型略有不同。

答案 2 :(得分:1)

  

我正试图绕过我的脑袋   是我如何暴露我的存储库和   model,将在服务器上。是   它甚至可能暴露复杂   通过a状态的业务对象   网络服务,或者我必须使用   专有技术不是   语言/平台无关,如.Net   远程处理,EJB,COM +,DCOM等?

一个好的领域模型将是高度行为的,并围绕问题领域(以及您与领域专家的讨论)设计,因此我反对将其设计为暴露给远程消费者(与设计它的方式相同)从数据库或GUI首先是个坏主意。)

相反,我会考虑使用REST或消息传递之类的样式,并决定要公开的接口,然后映射到域或从域映射。因此,如果您使用REST,您将设计资源和API(URL,表示等),然后您需要从域模型中实现它。

如果这变得不自然,那么你总是可以拥有多个模型,例如将一个单独的只读表示特定模型映射到同一个数据源(或者包含复杂的行为领域模型)是我的一种方法多次使用。

  

其他一些限制因素是我   不想继续加载   来自的复杂域对象   数据库或传递它的全部   每次我想做一个电线   操作

查看HTTP中的缓存并支持资源的多个表示,还要查看数据访问解决方案中的缓存。

  

验证和错误消息   信息也需要   显示给用户。我想成为   能够逻辑地打电话给我很多   域对象操作就像它一样   在同一台机器上运行。

您可以将此表示为资源,也可以更多地查看HTTP状态代码以及您希望在这些情况下使用的响应正文。