具有数据协定访问问题的WCF服务

时间:2013-06-04 09:56:11

标签: c# wcf

我对 WCF 程序非常新,并且遇到了一些困难。

我有客户端应用程序收集student数据,然后student数据将通过web services存储到数据库。

所以我在客户端有student class,当新学生到来时,我创建了学生对象并分配了收集的值。

将此数据传递给服务的最合适方式是什么?

我可以遵循的选项是;

选项1

public void InsertStudent(string id, string name, string address)  
{  
} 

我觉得这不好。因为如果我必须传递数据参数列表将会变得冗长。

选项2

定义服务上的数据合约

public void InsertStudent(WcfStudent obj)  
{

}

我觉得这很好。但是我对如何发送参数(WcfStudent)有一些问题。 我是否需要在客户端创建此WcfStudent对象并传递该对象。

WcfStudent obj=new WcfStudent()

obj.name=myStudent.name;

obj.id=myStudent.id;

client.InsertStudent(obj);

这是正确的方法吗?

请建议我。

3 个答案:

答案 0 :(得分:2)

当然,就像你说的第二种选择更好。在WCF项目中,您必须创建DataContract WcfStudent。在具有服务引用的项目中(这就是您所谓的客户端),您必须只执行方法(OperationContract)InsertStudent。你如何在理论上创建这个对象并不重要,但我认为在你的'客户端'中也有一个名为例如StudentBO的对象并在WcfStudent和StudentBO之间创建映射或者使用一些工具例如Automapper是一个好习惯。

如果你是WCF的全新人,请阅读DataContract,DataMember。

祝你好运!

<强>更新

说到你的评论会更好:

public WcfStudent(MyStudent myStudent)
{
    this.Id= myStudent.Id;
    this.Name= myStudent.Name;
}

答案 1 :(得分:0)

您的WCF服务将包含WcfStudent类的定义,并将该类定义为数据合同(如果您不使用单独的DTO)。

通过WSDL文件或Visual Studio界面在客户端项目中引用WCF服务,使您的客户端应用程序可以查看或了解服务的公共类,接口和其他内容。这应该包括WcfStudent类。然后,您可以通过以下内容继续在代码中使用它:

MyWcfService.WcfStudent student = new MyWcfService.WcfStudent();
//assign values, etc

根据需要在应用程序中处理该学生对象,然后在准备好保留时调用您的Web服务。

client.InsertStudent (student);

答案 2 :(得分:0)

您通常会使用数据合同而不是单个参数,因为这样您就可以轻松地对其进行版本化;并使用其他可选参数轻松扩展它们,并且仍然可以向后兼容。

我个人喜欢一致地遵循请求/响应模式:

public InsertStudentResponse InsertStudent(InsertStudentRequest request)  
{  
} 

如果您不期望结果,那么响应类型当然可以无效。

请求对象仅包含您完成te请求所需的内容。没有更多,没有更少。例如,如果要更改学生的地址,请不要在传递所有学生属性时调用ModifyStudent,而是调用MoveStudent并仅传递新的地址信息;这样你就可以明确定义业务运作。

关于操作的命名,InsertStudent是类似CRUD的命名,而我更喜欢用商业术语命名,例如RegisterNewStudent或其他。

另外不要忘记错误合同:不要抛出异常,抛出错误。