我对 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);
这是正确的方法吗?
请建议我。
答案 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
或其他。
另外不要忘记错误合同:不要抛出异常,抛出错误。