代理类与真实类的WCF问题

时间:2009-10-01 21:14:01

标签: wcf

我的控制台应用程序使用的是WCF服务。生成使用控制台应用程序命名空间的代理类。

DataAccess层有一个方法GetItems,它需要一个属于不同命名空间的ITEM对象。有没有告诉WCF创建属于某个命名空间的项目,而不是使用客户端项目来创建命名空间!

更新

问题在于:

// The following namespace belongs in the class library project 
MYProject.Something.Foo foo = new Foo(); 
foo.Text = "hello world"; 

// Now the webservice has a method ProcessFoo but the proxy 
// class shows something like this: 
ProcessFoo(MyClientProject.Something.foo); 

我无法将我的MYProject.Something.Foo发送到ProcessFoo方法。

4 个答案:

答案 0 :(得分:2)

.NET WCF客户端是否只调用此服务?如果是这样,那么当您创建服务引用时,您可以告诉WCF共享现有类型,而不是创建返回类型的代理版本。

当然,这只适用于WCF客户端。任何其他类型的客户端都需要使用代理类,这就是您看起来所处的情况。

有关说明,请参阅Basics: How Web Services Work。我最初写的是关于ASMX Web服务的,但它一般适用于Web服务。

答案 1 :(得分:0)

<强>更新

原来我完全误解了你原来的问题。您可以手动将MYProject.Something.foo对象的属性复制到MyClientProject.Something.foo,或者如果它是您经常使用的操作,您可以实现某种转换例程,以便您可以执行以下操作:

MYProject.Something.Foo foo = new Foo(); 
foo.Text = "hello world"; 

ProcessFoo((MyClientProject.Something.foo)foo);

<强> ORIGINAL

每次创建对象时,始终可以使用其全名来指定命名空间:

SqlConnection conn = new SqlConnect();

相当于

System.Data.SqlClient.SqlConnection conn = 
    new System.Data.SqlClient.SqlConnection();

答案 2 :(得分:0)

您可以使用import语句为别名设置别名,避免命名冲突:

import MyProject; // MyProject.Something
import ServiceSomething = MyClientProject.Something;

现在,您可以在同一个类/代码文件中引用这两种类型,将服务代理类称为ServiceSomething

修改:我实际上建议您与网络服务代理共享您的实体。它使版本控制变得更加困难。只需创建一个静态的SomethingMapping类,它来回映射实例,然后永远不要在使用代理的类之外使用Web服务代理类。

答案 3 :(得分:0)

我打算建议你做一些你正在做的事情的替代方案:

我建议不要这样做,而不是重新编写代码,以便通过Web服务传递MyProject.Something.Foo类。原因如下:

通过在服务合同中使用MyProject.Something.Foo类,您可以将类紧密地耦合到Web服务,从而耦合您的Web服务的客户端,这些客户端需要生成自己的客户端代理(或者当量)。这种耦合使您很难在将来更改隐藏在服务合同背后的逻辑的实现,因为如果您进行涉及更改类的公共接口的更改,则必须重新生成代理并更改您的Web服务发布的合同。所有客户也是如此。

相反,我建议您使用svcutil生成代理;保持你的MyProject.Something.Foo类(这是你的业务逻辑层)分开;并编写一些代码来映射它们。然后,您更有可能吸收业务逻辑类的更改,而不必中断并重新生成服务合同。

我(不是很有说服力,读过这篇文章)试图了解的是SOA设计原则,称为“服务共享架构和合同,而不是类” - 给这个谷歌,看看你的想法。

希望这有用!