Indigo参考 (2) DataContract 使用 详解(转)

摘要:
私有访问域控制不影响其成为DataContract的成员。属性的价值是否会在IndigoService和Client之间转移,仅取决于它是否属于DataContract中的DataMember。我们将控制台创建为IndigoClient,并通过命令行工具svcutil自动生成所需的代理类文件。在下一个Indigo参考系列中,我将描述如何在客户端Exe上不使用svcutil,并手动编写ServiceContract和DataContract,以进一步验证服务和客户端交换契约和模式,而不是类。

在阅读之前,请先阅读我写过的第一篇有关Indigo的文章.

Data Contract是用来定义Indigo Service与Client端之间用来交换的数据的格式,如果我们需要传递自定义的数据,那么就需要将其定义为符合Indigo规范的Data Contract。数据里面的每一个数据项,被成为Data Member

[DataContract]
public class UserInfo
{
    [DataMember]
    public String FirstName;

    [DataMember]
    public String LastName;

    [DataMember]
    private DateTime Birthday;
}

 

上面的代码示范创建了一个UserInfo类,并且使用“[DataContractAttribute]”特性对类进行了修饰,对于需要被加入到Contract中的数据项,也使用“[DataMemberAttribute]”特性进行了标记。

 

得注意的是,UserInfo有一个特意的设计,那就是Birtyday这个属性,其访问域被定义为private的,但是我们仍然使用了“[DataMemberAttribute]”来标记它。private的访问域控制并不会影响其成为Data Contract中的一个Member。一个属性即使是public的,但是如果没有被“[DataMemberAttribute]”来标记,那么这个属性也不会成为Data Contract中的一个数据项。就是说,我们可以认为基于类的可见性控制,和其是否是Data Contract中的一项Data Member是没有关系的。属性的值是否会在Indigo Service和Client间进行传递,只和它是否是属于Data Contract中的一项Data Member有关系。

然后我们开始定义Service Contract

 

[ServiceContract]
public interface IProfileService
{
    [OperationContract]
    UserInfo GetUserByID(Int32 userID);
}

public class ProfileService : IProfileService
{

    public UserInfo GetUserByID(Int32 userID)
    {
        UserInfo user = new UserInfo();
        user.FirstName = "Kaneboy";
        user.LastName = "Tu";
        user.Birthday = new DateTime(1979, 1, 1);

        return user;
    }
}

上面的代码创建了一个IProfileService接口,然后定义这个接口为Service Contract,接着通过一个ProfileService类实现IProfileService接口,让其成为Service Contract的具体实现类。像这样将Service Contract定义在一个接口上,而并非是一个具体的类上,是更常见的方式。

由于这篇文章将重点放在Data Contract的定义之上,所以Indigo Service剩下的.svc和配置文件的内容,就不再详叙,大家参考上一篇Indigo的文章即可。

我们创建一个Console成为作为Indigo Client,通过svcutil这个命令行工具,自动生成所需的proxy类文件。在自动生成的文件中,我们可以找到UserInfo这个类,由于它被定义成为了Data Contract,所以svcutil会自动帮我们创建它。svcutil的使用方法和客户端app.config的定义,也请参加上一篇Indigo文章

 

最后,我们在Main()中调用Indigo Service:

ProfileServiceProxy proSvcPrx = new ProfileServiceProxy("IProfileService");
UserInfo user = proSvcPrx.GetUserByID(1);

OK,我们成功验证了Data Contract的概念和基本的使用方法。下一篇Indigo参考系列文章,我将讲述如何在Client端不使用svcutil.exe这个工具,而手工书写Service Contract和Data Contract,以进一步验证Service和Client端交换的是Contract和Schema,而并非Class,这样一个基本理念。

免责声明:文章转载自《Indigo参考 (2) DataContract 使用 详解(转)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇4. selenium中鼠标和键盘操作安装python的pywin32安装不了,提示找不到py3.6-32下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C# 与 SQLite的操作

1、通过Add References引用SQLite ADO .NET安装目录的bin目录下的System.Data.SQLite.DLL。 2、创建数据库文件:因为始终是个0字节文件,应该利用IO也可以(?!)。 System.Data.SQLite.SQLiteConnection.CreateFile(datasource);3、连接数据库 Syst...

当微信小程序遇到AR(二)

当微信小程序遇到AR,会擦出怎么样的火花?期待与激动...... 通过该教程,可以从基础开始打造一个微信小程序的AR框架,所有代码开源,提供大家学习。 本课程需要一定的基础:微信开发者工具,JavaScript,Html,Css 第二章:基石-摄像头数据获取 【前情提要】 上一章,我们了解了微信小程序与AR相遇一些前因后果,同时也,罗列出来是要实现这样...

dom 绑定数据

一、绑定/修改 .jQuery修改属性值,都是在内存中进行的,并不会修改 DOM 1. 对象绑定$(selector).data(name) $("#form").data("name") 2. dom 绑定 $.data(element,name, val); jQuery.data($("#form")[0], "testing", 123); 3....

小程序 picker 多列选择器 数据动态获取

需求是将各校区对应各班级的数据 以两列选择器的方式展示出来,并且可以在选择完成之后记录选结果参数。 校区数据 和 班级数据 分别是两个接口,以 校区 teach_area_id 字段关联 其各班级数据 <picker mode="multiSelector" bindchange="bindMultiPickerChange" bindco...

我的Python之路:浏览器模拟

一、浏览器模拟——Header属性    有的时候,我们无法爬取一些网页,也就是说会出现403错误,这是因为这些网页为了防止有人恶意去采集其信息所以进行了一些反爬虫的设置。   为了可以获取这些数据我们使用一些两种方法: 1、使用 build opener() 由于urlopen()不支持HTTP的高级运用所以我们要修改头报。可以使用urllib.requ...

DRF接口操作--群增,群更,群删

1.一个表可不可以有多个自增字段 2.用APIView,GenericAPIView,ModelViewSet重写Book的接口 1.一个表可不可以有多个自增字段 class Test(models.Model): id = models.AutoField(primary_key=True) index = models.AutoField() name...