.NET:DDD和ASMX,避免在代理类上使用多个名称空间

时间:2011-09-29 07:30:27

标签: c# .net web-services domain-driven-design asmx

我是DDD的新手,目前我尝试将项目重构为域驱动架构。该项目有一个客户端和一个服务器端(ASMX webservice)。现在我创建了一个名为“Domain”的类库,它由客户端应用程序和服务器引用。

现在我希望我的SOAP通信基于我的域模型。但是,如您所知,ASMX Web服务会在建立Web引用后立即在客户端中创建某种代理类库。
这导致在不同的名称空间下将每个域实体和值对象重复两次

  1. 是否可以直接使用域模型进行通信,避免生成ASMX代理类

  2. 如何在DDD中使用DTO?如您所知,某些域部件可能不可序列化(例如NHibernate / IList用法),因此在过去我经常创建更简单的DTO版本的实体类。 在域中定义DTO实体是否常见?

2 个答案:

答案 0 :(得分:1)

如果您使用 WCF ,则可以在客户端和服务器引用的共享程序集中安装服务接口和DTO类。将项目转换为使用WCF可能不会太难,但在开始之前还有很多学习要做。

如果您希望客户端和服务器紧密连接,共享接口程序集是一个很好的理想选择,因此除非双方都归同一个团队所有,否则它不能正常工作< /强>

经常尝试在服务器和客户端上使用相同的类来设计问题,但是在适合设计时共享类可以节省大量的工作。

(抱歉,我不认为你可以使用与asmx的共享程序集,它更像是来自.net历史记录的远程方面的概念)

答案 1 :(得分:0)

无法使用原始域模型(通过引用获取 - 不是域模型的WEB引用)与ASMX进行通信:您必须使用asmx公开的模型是相似但不相同(即List在Array中转换)。

可以 - 并且很容易 - 从许多具有相同名称空间的网络服务中创建许多类
像这样

创建一个 .bat 文件
"C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\wsdl.exe" /sharetypes /o:C:\code\MyProxy.cs /namespace:MyProxies http://website/FirstService.asmx http://website/SecondService.asmx  
Pause 

其中
- "C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\wsdl.exe" wsdl.exe 具有相对路径(必须在您的PC上)
- /sharetypes表示您希望输出中的仅1个名称空间 - /o:C:\code\MyProxy.cs .cs 文件名,其中包含所有已创建的类 - /namespace:MyProxies是所有类
创建的命名空间 - http://website/FirstService.asmx http://website/SecondService.asmx是您需要调用的网络服务列表 - Pause表示您希望窗口的shel保持打开状态以读取操作的反馈。


请注意
1)所有说明必须在一行(不要按回车键);第二行Pause 2)如果/o:C:\code\MyProxy.cs将成为您的解决方案的一部分(我认为是这样)并且您使用源代码控制该文件必须签出才能被wsdl覆盖.EXE