我是DDD的新手,目前我尝试将项目重构为域驱动架构。该项目有一个客户端和一个服务器端(ASMX webservice)。现在我创建了一个名为“Domain”的类库,它由客户端应用程序和服务器引用。
现在我希望我的SOAP通信基于我的域模型。但是,如您所知,ASMX Web服务会在建立Web引用后立即在客户端中创建某种代理类库。
这导致在不同的名称空间下将每个域实体和值对象重复两次。
是否可以直接使用域模型进行通信,避免生成ASMX代理类?
如何在DDD中使用DTO?如您所知,某些域部件可能不可序列化(例如NHibernate / IList用法),因此在过去我经常创建更简单的DTO版本的实体类。 在域中定义DTO实体是否常见??
答案 0 :(得分:1)
如果您使用 WCF ,则可以在客户端和服务器引用的共享程序集中安装服务接口和DTO类。将项目转换为使用WCF可能不会太难,但在开始之前还有很多学习要做。
如果您希望客户端和服务器紧密连接,共享接口程序集是一个很好的理想选择,因此除非双方都归同一个团队所有,否则它不能正常工作< /强>
经常尝试在服务器和客户端上使用相同的类来设计问题,但是在适合设计时共享类可以节省大量的工作。
(抱歉,我不认为你可以使用与asmx的共享程序集,它更像是来自.net历史记录的远程方面的概念)
答案 1 :(得分:0)
无法使用原始域模型(通过引用获取 - 不是域模型的WEB引用)与ASMX进行通信:您必须使用asmx公开的模型是相似但不相同(即List在Array中转换)。
可以 - 并且很容易 - 从许多具有相同名称空间的网络服务中创建许多类。
像这样
"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