【问题标题】:What should keep into this design approach这种设计方法应该保留什么
【发布时间】:2014-06-20 08:34:27
【问题描述】:

我的项目解决方案如下:

  1. MVC 项目(包含下面列出的两个项目的参考)
  2. 包含业务方法的 WCF 服务(包含下面列出的项目的参考)
  3. DTO 或 BusinessOBject 的通用项目

IN MVC - 调用 WCF 服务方法如下 - IList<Employee> RetriveData() 它是从 MVC 调用的 - ServiceClient.RetrieveData() ,现在的问题是返回对象 Employee 指向 ServiceHost.Employee 对象而不是 - Common.DTO.Employee 对象(库项目)所以,它给出了类型转换错误。

谁能建议我这里的解决方案是什么,或者我应该从 MVC 中删除“Common.DTO”项目引用,只使用 Servicehost.Employee 对象。

请指导我这个设计,应该使用什么。

注意:所有对象都是 DATACONTRACT(可序列化的)。 在 MVC 应用程序中,在重试 DTO 对象后,我确实将它们转换为 Viewmodel(它还在内部引用任何集合对象,如 IList<ServiceHost.LookupItem>。直接使用所有生成的序列化对象是否可以,或者,我是否必须转换/转换每个返回对象转换为common.DTO. 对象,然后转换为 ViewModel ?

谢谢

【问题讨论】:

    标签: c# .net asp.net-mvc wcf dto


    【解决方案1】:

    不要使用 Visual Studio 的 添加服务参考。这样做会导致在解决方案中定义多种类型,并且随着时间的推移客户端代理将变得不同步

    最好定义一个您的整个解决方案使用的通用合同程序集。

    请参阅WCF the Manual Way…the Right Way,具体请参见第 3 页

    您应该尽可能遵循规范数据模型等模式。这意味着 POCO ORM 的类型相同;周转基金;并作为视图模型中的聚合。数据转换成本高;导致增加维护和可能的保真度损失。 http://www.soapatterns.org/http://www.eaipatterns.com/

    【讨论】:

    • 我已经完成了该方法并使用 svcutil 生成了代理类并将其添加到客户端 MVC 应用程序中(删除了服务参考)。现在,虽然返回对象的类型是 Common.DTO 类型,但没有对 -Common.DTO 项目的引用。一些进一步的问题-1。每次更新服务时我是否必须生成代理或以任何方式直接更新服务 2)我是否必须在客户端项目中添加“Common.DTO”或者它可以从代理类的参考中引用 3)有什么区别参考代理类COMMON.DTOServiceHost.DTO,因为它们都是序列化对象。谢谢
    • 你读过那篇文章吗? svcutilAdd Service Reference 一样糟糕。您的 Common.DTO 应该是您的合同库,那么您为什么要删除它? 1)是的,这就是生成代理的问题。 2)你应该参考Common.DTO 3)阅读文章再次
    【解决方案2】:

    这实际上取决于您想要的抽象级别。

    如果ServiceHost.Employee 是您的域模型,而 MVC 是您的表示层,那么使用 DTO 来弥补这里的差距是有意义的。鉴于这是您似乎想要使用的方法,那么解决方案是让 ServiceClient.RetrieveData 返回 IList<Common.DTO.Employee> 而不是 IList<ServiceHost.Employee>

    【讨论】:

    • 请查看更新后的问题,了解更多详情。我想知道,是否可以使用 ServiceHost.Employee 或者它是错误的。而且我必须在 MVC 中使用 Common.DTO.Employee ......有什么影响或成本吗?
    • @user3711357 是的,有影响和成本。看我的回答
    • 好的,但是,服务客户端只返回IList<ServiceHost.Employee>。即使,WCF 服务和 MVC 两个应用程序都具有相同的项目引用,即 - Common.DTO 。我应该如何将 WCF 服务的服务引用添加到 MVC 项目中,所以我不需要编写从 ServiceHost.EmployeeCommon.DTO.Employee 的转换逻辑,并且直接返回对象为 IList<Common.DTO.Employee>。谢谢
    • @user3711357 在那篇文章中有解释。基本上,您添加对您页面的新客户端代理程序集的引用。请参阅我提到的那篇文章的第 5 页
    猜你喜欢
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 2016-02-06
    • 2012-11-16
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多