如何在多个 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 服务:
- Service_A
- Service_B
- Service_C
这 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
我有一个名为 SERVICE_ABC.
的服务项目(You can download my example project in this link)
在这个项目中我定义了 3 个 WCF 服务:
- Service_A
- Service_B
- Service_C
这 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