0

我对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);

这是正确的方法吗?

请给我建议。

4

3 回答 3

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;
}
于 2013-06-04T10:06:55.973 回答
0

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

就我个人而言,我喜欢始终如一地遵循请求/响应模式:

public InsertStudentResponse InsertStudent(InsertStudentRequest request)  
{  
} 

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

request 对象仅包含完成 te request 所需的内容。不多也不少。比如要改变一个学生的地址,不要在传递所有学生属性的同时调用ModifyStudent,而是调用MoveStudent,只传递新的地址信息;以便您明确定义业务运营。

关于你的操作的命名,InsertStudent是一个类似于 CRUD 的命名,而我更喜欢用业务术语来命名它们,比如RegisterNewStudent或其他东西。

也不要忘记错误契约:不要抛出异常,抛出错误。

于 2013-06-04T10:55:57.760 回答
0

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

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

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

在您认为合适的时候在您的应用程序中操作该学生对象,然后在您准备好持久化时调用您的 Web 服务。

client.InsertStudent (student);
于 2013-06-04T10:11:44.297 回答