2009-10-01 84 views
1

我有一个WCF服务,我的控制台应用程序使用它。生成使用控制台应用程序名称空间的代理类。代理类与真实类WCF问题

的数据访问层具有需要属于不同的命名空间一个ITEM对象的方法GetItems。有无论如何告诉WCF创建属于某个名称空间的项目,而不是使用客户端项目来创建名称空间!

UPDATE

这里的问题是:

// 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方法。

回答

0

UPDATE

证明,我完全错误理解你原来的问题。您可以手动您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(); 
+0

这里的问题是: //以下命名空间所属的类库项目 MYProject.Something.Foo富=新的Foo(); foo.Text =“hello world”; 现在web服务有一个ProcessFoo方法,但代理类显示如下: ProcessFoo(MyClientProject.Something.foo); 我无法将我的MYProject.Something.Foo发送到ProcessFoo方法。 – azamsharp 2009-10-01 21:19:24

+0

转换对我来说将是一个非常痛苦的过程! – azamsharp 2009-10-01 21:38:00

0

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

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

现在,您可以从相同的类/代码文件中引用这两种类型,指的是服务代理类为ServiceSomething

编辑:我实际上建议你做不是与你的实体共享web服务代理。它使版本化变得更加困难。只需创建一个静态的SomethingMapping类,它可以来回映射实例,然后从不使用使用代理的类之外的Web服务代理类。

2

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

当然,这只适用于WCF客户端。任何其他类型的客户端需要使用代理类,这是你似乎是在的情况。

一个解释见Basics: How Web Services Work。我最初编写了关于ASMX Web服务的内容,但它通常适用于Web服务。

+0

我删除了服务并再次添加它,并告诉WCF使用类库程序集中的类型,但它仅使用其自己的名称空间生成代理类! – azamsharp 2009-10-01 21:27:30

+0

您的客户端项目是否引用了类库?库是否显示在程序集列表框中? – 2009-10-01 21:33:03

+0

是的,库显示在程序集列表中。我选择dll并创建服务。但是,当我检查reference.cs文件并检查AddCustomer方法的参数时,它显示该方法仍在使用客户端(控制台应用程序)命名空间。 – azamsharp 2009-10-01 21:35:34

0

我会建议做你正在尝试做的一种替代方案:

而不是重新加工您的代码,以便您让您通过Web服务MyProject.Something.Foo类,我建议不要这样做。原因如下:

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

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

我想说的是,SOA设计原则被称为“服务共享模式和合同,而不是类” - 给这个谷歌,看看你的想法。

希望这有帮助!

+0

在客户端类和业务类之间创建映射的问题是我必须为所有客户端执行此操作。如果所有的客户都可以使用商务舱,那就太好了。这样就不需要映射。 PS:类之间的映射很复杂,因为它涉及属于不同类的枚举。 – azamsharp 2009-10-01 21:45:19

+0

为了清楚起见,我建议在您的服务器端Web服务代理和您的业务逻辑类之间进行映射 - 不涉及客户端。它*是*额外的工作;但是它增加了一层抽象,可能会让你远离昂贵地破坏Web服务合同。 – razlebe 2009-10-01 22:06:43