如何在多个 WCF 服务和 Web 端之间使用(共享)Datacontract 或 Datatype

How can I Use (Share) Datacontract or Datatype between multiple WCF service and web side

我有一个名为 SERVICE_ABC.

的服务项目

(You can download my example project in this link)

在这个项目中我定义了 3 个 WCF 服务:

这 3 项服务在 SERVICE_ABC 项目中使用相同的数据合同 class。例如,这 3 个服务使用 PersonelDTO class 作为数据合同。

我的问题是:如果我调用 return PersonelDTO 类型的服务函数,我必须得到这样的结果:

ServiceReference_A.PersonelDTO DataA = clientA.GetMyData();
ServiceReference_B.PersonelDTO DataB = clientB.GetMyData();
ServiceReference_C.PersonelDTO DataC = clientC.GetMyData();

但我想这样定义:

PersonelDTO DataA = clientA.GetMyData();
PersonelDTO DataB = clientB.GetMyData();
PersonelDTO DataC = clientC.GetMyData();

(如果我这样做,visual studio 会给出类似 "PersonelDTO is ambiguous reference between ServirceA, ServiceB and ServiceC" 的错误) 也就是说,我想在 MVC 控制器中只使用一种数据类型。因为 PersonelDTO class 在 SERVICE_ABC 项目中是相同的。所以我不想像 blabla1.PersonelDTO , blabla2.PersonelDTO

这样专门化每个 PersonelDTO

我该怎么做?

我自己找到了解决方案。 (但我必须说,你的回答很薄弱。)

解决方法: 1-) 首先我们必须生成一个新的 Class 库。右键单击主服务解决方案和select
添加 > 添加项目 > Class 库并命名为 SampleLibrary

2-)在此 Class 库中生成所有数据传输对象类(DTO 类)。 (例如 右键单击 > 添加 > Class 并输入名称 PersonelDTO.cs )

3-) 右键单击​​ Class 库并单击“重建”按钮。

4-) 现在我们建立SampleLibrary.dll文件。我们将在我们的服务解决方案和 MVC Web 解决方案中使用这个 .dll 文件。首先,

Select SERVICE_ABC 解决方案 > 参考并右键单击。 Select 添加引用 > 浏览选项卡 > 单击浏览按钮

5-) 在浏览 window、select SampleLibrary.dll 并将此文件添加到 WCF 服务作为参考。 (您可以在 C:\test\SERVICE_ABC\SampleLibrary\bin\Release\SampleLibrary.dll 或 ...\Debug\SampleLibrary.dll 路径中找到此文件。如果您将项目构建为调试模式,您将在调试文件夹中获取它。如果您以发布模式构建,.dll 文件将位于发布文件夹中)

6-) 在 WCF 服务中使用 Class 库的数据传输对象文件。 例如在服务中这样定义:

public FooDTO GetFoo()
    {            
        return new SampleLibrary.FooDTO() { Name = "Service A" };
    }

    public BarDTO GetBar()
    {
        //or add using SampleLibrary; definition begining of the pages 
        //and write just as BarDTO without SampleLibrary.BarDTO
        return new BarDTO() { Name = "Service A" };
    }

7-) 重建并 运行 您的 WCF 服务。 (Service_ABC)

8-) 复制 SampleLibrary.dll 由 WCF 服务构建 的文件 在 Service\bin 文件夹。 (例如,您可以在 C:\test\SERVICE_ABC\SERVICE_ABC\bin 文件夹中找到它)

9-) 将此 SampleLibrary.dll 文件粘贴到您的 MVC Web 解决方案的 bin 文件夹中。 (例如,您可以在 C:\test\WEB_ABC\WEB_ABC\bin 文件夹中找到它)

10-) Select 您的 Web Mvc 解决方案 > 引用并右键单击 > 添加引用 > 浏览选项卡 > 浏览按钮

11-) Select SampleLibrary.dll 我们在第 9 步粘贴了它,因此也将此 dll 文件作为参考添加到您的 Web Mvc 解决方案中。

12-) 关闭您的 Web 解决方案并重新打开它。 (因为当您 运行 更新服务引用命令时,解决方案无法正确设置重用数据类型。您必须重新启动 Vusial Studio 以便它可以重新加载所有 dll 文件)

13-) 右键单击​​您的服务参考(在上面的图片中:ServiceReference_A、ServiceReference_B 或 ServiceReference_C)和 select "Update Service Reference"
(确保:在所有引用的程序集中重用类型选项 selected,如果您不知道 selected 与否,则右键单击您的服务引用并 select 配置服务引用并在打开的 window)

所有这些.. 在此过程之后,我的 WCF 服务 (SERVICE_ABC) 和我的 Web Mvc 项目使用相同的 Class 库 dll 文件。如果我在 SERVICE_ABC 中定义多个服务,并且我在 MVC 端使用相同的类型定义获取它。 即此代码现在可以正常工作..

//ServiceReference_A.PersonelDTO DataA = clientA.GetMyData();//old
//ServiceReference_B.PersonelDTO DataB = clientB.GetMyData();//old 
//ServiceReference_C.PersonelDTO DataC = clientC.GetMyData();//old

PersonelDTO DataA = clientA.GetMyData();//new definition
        PersonelDTO DataB = clientB.GetMyData();//new definition
        PersonelDTO DataC = clientC.GetMyData();//new definition