【发布时间】:2012-06-08 18:28:57
【问题描述】:
我是 C# 和 WCF 的新手,来自 Java 背景。
我有一个托管在 IIS 上的 WCF 服务的解决方案,该服务有一个 Employee 类和一个方法...
public Employee getEmployee(int loginId)
此方法获取 loginId,查询数据库并使用结果创建一个 Employee 对象,然后返回 Employee 对象。很简单。
所以我有一个客户端,到目前为止,它所做的只是调用一个简单的“Hello World”网络方法来向我证明它已配置为与服务对话。现在我想要一个登录按钮来获取输入的 loginId,调用 getEmployee,并使用返回值创建一个本地 Employee 对象。
那么,我对如何在客户端定义 Employee 类感到困惑?关于如何做如此简单的事情的信息并不多。就像 AXIS2 和 NetBeans for Java 一样,这将是非常简单的,有很多教程来展示如何操作,但对于 WCF,似乎每个教程都只是假设我没有的某些知识。
所以下面的帖子说这可以通过在单独的程序集中定义我的 Employee 类来完成,并从 WCF 服务项目和客户端项目中引用 .dll(顺便说一句,两者都在单独的解决方案中)。
WCF passing a custom object to client and running it's methods
它说“您可以创建一个合同程序集(一个包含您的瘦域模型(例如 Person 等)的程序集,您可以将自己的逻辑添加到其中。”,但没有解释如何执行此操作或提供任何参考到哪里可以找到更多信息或说明。
无论如何,我的 Employee 类已经直接在 WCF 服务项目中定义了。如果有人可以提供有关如何将其移至“合同程序集”的任何信息(我是 C# 菜鸟,以前甚至从未创建过 DLL;只是 Windows 窗体项目),那将不胜感激。
另外,我在同一篇文章的另一个答案中看到以下...
"1.如果你不能改变dll的来源,又想调用dll的public方法,最好使用反射。所以,你从WCF接收对象,用返回值设置Person属性,调用方法。”
我理解上面的概念;我会在客户端定义一个单独的 Employee 类,然后以某种方式使用反射从 web 方法返回的对象中获取值,并将它们分配给一个新的 Employee 对象,对吧?只是,我不知道如何使用反射来获取值。
最佳做法是什么?我是否应该像其他帖子所建议的那样定义一个 IEmployee 接口,然后将其放入具有常规 Employee 类的 DLL 中,并从服务器和客户端引用它,并从 web 方法返回 IEmployee 而不是 Employee?如果这是最好的做法,是否有什么特别的事情要做,或者只要这样的 DLL 在双方都被引用,我可以直接做这样的事情吗?
int loginId = Int32.Parse(this.loginInputTxt.Text);
LaborService.LaborServiceClient proxy = new LaborService.LaborServiceClient();
Employee emp = (Employee)proxy.getEmployee(loginId);
【问题讨论】:
-
当你添加对WCF服务的引用时,它会自动在客户端项目中为你创建代理类。
-
在哪里可以看到这些?我没有看到他们。这就是我期望发生的事情,就像在 Netbeans 中使用基于 Java 的 AXIS2 时一样,但我没有看到它们在哪里,并且尝试在客户端将某些东西声明为 Employee 导致由于未知类型而导致编译错误。
-
哦,我明白了!如果我将其声明为 LaborService.Employee 而不仅仅是 Employee,它就可以工作。如果我在 Employee 类的 References.cs 中查看对象浏览器中的 LaborService,它会显示自动生成的代理类。凉爽的。我猜我可以按原样使用这些属性,但不能使用这些方法吗?
-
是的,如果它们存在于代理类中,您也可以使用这些方法。在这些代理类中生成的所有内容都在那里,因为它是作为服务合同的一部分提供的(这意味着服务将处理该功能)。请注意,每次调用代理类上的方法时,它都会向服务发送请求以执行该操作。代理类中的方法没有任何功能在客户端本地执行。
-
谢谢。我现在知道了!尽管客户端和服务器项目都引用了它,但我实际上走的是拥有共享 DLL 的路线。这似乎运作良好,然后我可以在本地拥有这些对象。我宁愿在客户端本地拥有实际对象,而不是使用代理对象。感谢您的帮助!
标签: c# .net wcf web-services iis