如何在客户端使用自定义类型对象

时间:2012-06-08 18:28:57

标签: c# .net wcf web-services iis

我是C#和WCF的新手,来自Java背景。

我有一个在IIS上托管的WCF服务的解决方案,它有一个Employee类和一个方法......

public Employee getEmployee(int loginId)

此方法获取loginId,查询数据库并使用结果创建Employee对象,然后返回Employee对象。很简单。

所以我有一个客户端,到目前为止所做的只是调用一个简单的“Hello World”Web方法来向我证明它配置正确与服务通信。现在我想要一个登录按钮来获取输入的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#noob,甚至以前都没有创建过DLL;只是Windows Forms项目),那将非常感激。

另外,我在同一篇文章的另一个答案中看到以下内容......

“1。如果您无法更改dll的源并想调用dll的公共方法,最好使用反射。因此,您从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);

2 个答案:

答案 0 :(得分:3)

WCF支持开箱即用的实体共享。

您需要执行以下步骤:

  1. 将实体类移至单独的Contract类库。确保[DataContract][DataMember]属性已到位。
  2. 将对合同项目的引用添加到ClientServer项目。
  3. 生成服务参考。检查“合同程序集中的重用类型”是否已选中。单击“添加服务引用”对话框中的“高级...”按钮。
  4. 您的代理类将引用合同项目中描述的类型。

答案 1 :(得分:1)

当您添加对WCF服务的引用时,它将自动在客户端项目中为您创建代理类。它们是在子命名空间中创建的。如果在解决方案资源管理器中显示所有文件,则可以在Web引用下查看它们。