我的控制台应用程序使用的是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方法。
答案 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设计原则,称为“服务共享架构和合同,而不是类” - 给这个谷歌,看看你的想法。
希望这有用!