Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这种设计方法应该保留什么_C#_.net_Asp.net Mvc_Wcf_Dto - Fatal编程技术网

C# 这种设计方法应该保留什么

C# 这种设计方法应该保留什么,c#,.net,asp.net-mvc,wcf,dto,C#,.net,Asp.net Mvc,Wcf,Dto,我的项目解决方案如下: MVC项目(包含以下两个项目的参考) 包含业务方法的WCF服务(包含下列项目的参考) DTO或BusinessOBject的通用项目 在MVC中,调用WCF服务方法如下-IList RetrieveData() 它是从MVC-ServiceClient.RetrieveData()调用的,现在的问题是返回对象Employee指向ServiceHost.Employee对象,而不是-Common.DTO.Employee对象(库项目),因此,它给出了类型转换错误 有谁能建议

我的项目解决方案如下:

  • MVC项目(包含以下两个项目的参考)
  • 包含业务方法的WCF服务(包含下列项目的参考)
  • DTO或BusinessOBject的通用项目
  • 在MVC中,调用WCF服务方法如下-
    IList RetrieveData()
    它是从MVC-ServiceClient.RetrieveData()调用的,现在的问题是返回对象
    Employee
    指向
    ServiceHost.Employee
    对象,而不是-
    Common.DTO.Employee
    对象(库项目),因此,它给出了类型转换错误

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

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

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


    谢谢

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


    如果
    ServiceHost.Employee
    是您的域模型,而MVC是您的表示层,那么使用DTO来弥合这一差距是有意义的。鉴于这是您似乎想要使用的方法,那么解决方案将是使用
    ServiceClient.RetrieveData
    返回
    IList
    ,而不是
    IList
    不要使用Visual Studio的添加服务引用。这样做将导致解决方案中定义多种类型,并且随着时间的推移,客户端代理将变得不同步

    最好定义一个通用的契约程序集,供整个解决方案使用

    具体请参见第3页


    您应该尽可能遵循规范数据模型等模式。这意味着POCO ORM、WCF和视图模型中的聚合类型相同。数据转换成本高昂,导致维护增加,可能会丢失保真度。

    请查找更新的问题,了解更多详细信息。我想知道,是否可以使用ServiceHost.Employee或它是错误的。我必须在MVC中使用Common.DTO.Employee…有任何影响或成本吗?@user3711357是的,有影响和成本。请参阅我的回答OK,但是,服务客户端仅返回
    IList
    。尽管WCF服务和MVC两个应用程序都具有相同的项目引用,即-
    Common.DTO
    。如何我应该将WCF服务的服务引用添加到MVC项目中,这样我就不需要将转换逻辑从
    ServiceHost.Employee
    写入
    Common.DTO.Employee
    ,直接返回对象为
    IList
    。谢谢You@user3711357这在那篇文章中已经解释过了。基本上,您添加了一个对新客户端代理程序集的引用参考我提到的那篇文章的第5页EDI已经使用了这种方法,使用svcutil生成了代理类,并将其添加到客户机MVC应用程序中(删除了服务引用)现在,虽然返回对象的类型为
    Common.DTO
    type,但没有对-
    Common.DTO
    project的引用。还有一些问题-1.每次更新服务时是否必须生成代理,或者是否有任何直接更新服务的方法2)是否必须添加“Common.DTO”在客户端项目中,或者从代理类的参考3)引用代理类
    COMMON.DTO
    ServiceHost.DTO
    有什么区别,因为两者都是序列化对象。谢谢你你读过那篇文章吗?svcutil与添加服务引用一样糟糕。您的Common.DTO应该是您的合同库,那么为什么要删除它呢?1) 是的,这就是生成的代理的问题。2) 你应该参考Common.dt再次阅读这篇文章