当前位置: 首页 > 编程语言 > C#

数据传输对象模式分享

时间:2023-04-10 20:01:11 C#

DataTransferObjectPattern抱歉,我是企业应用和设计模式的新手。可能是对设计模式缺乏了解的问题。我发现使用DTO传输数据更好。我的业务实体类如下:publicclassPatient{publicstringID{get;放;}publicstringFullName{get;放;}publicstringFirstName{get;放;}publicstring姓氏{get;放;所以在我的应用程序中,用户只能提供ID和HospitalID。所以它需要另一个网络服务并获取人员信息publicclassPersonDTO{publicstringNIC{get;放;}publicstringFullName{get;放;}publicstringFirstName{get;放;}publicstringBirthPlace{get;放;}publicstringBirthCertificateID{get;放;因此,基于这些信息,我转到了Patient对象。(使用DTO模式)所以我想写一个新类来转换如下。publicclassPatientDO{publicstaticPatientConvertToEntity(PatientRegistrationDTOpregDTO,PersonDTOperson){患者p=newPatient();p.NIC=pregDTO.NIC;p.FullName=person.FullName;p.FirstName=person.FirstName;返回;但最近我读了几篇文章,他们使用SerializerHelper类和XmlSerializer我不明白他们为什么使用类似的东西。对于DTOschema,需要使用XmlSerializer,为什么要使用它?您应该看看AutoMapper。http://automapper.org这是您可以包含在您的解决方案中的软件,它可以自动将一个类的值映射到另一个类。它会自动映射具有相同名称的属性,并且在涉及子对象时也非常智能。但是,它还可以在您需要时提供完整的映射控制。编辑几个示例来说明AutoMapper的工作原理。请注意,我从不在现实生活中编码。简洁的!示例类。//常见场景。与数据库有连接的实体类。命名空间实体{公共类管理器{公共虚拟intId{得到;放;}公共虚拟用户用户{get;放;}publicvirtualIListSerfs{get;放;}}publicclassUser{publicvirtualintId{get;放;}publicvirtualstringFirstname{get;放;}publicvirtualstringLastname{get;放;}}}//模型类-更扁平的命名空间模型{publicclassManager{publicintId{get;放;}publicstringUserFirstname{get;放;}publicstringUserLastname{get;放;}publicstringUserMiddlename{get;配置所有自动映射。使用我刚刚给出的示例,您可以像这样配置Entities.Manager和Models.Manager之间的映射:-//告诉AutoMapper这种转换是可能的Mapper.CreateMap();然后,在您的代码中,您将使用类似这样的东西从实体版本中获取新的Models.Manager对象。//映射类varmgr=Map(repoManager,newModels.Manager());顺便说一下,AM足够智能,如果您一致地命名它们,它可以自动解析很多属性。在上面的示例中,UserFirstname和UserLastname应该自动填充,因为:-但是,在Entities.Manager和Models.Manager之间映射之后,Models.Manager中的UserMiddlename属性将始终为空,因为User没有名为公共属性的中间名。CodeProject中有一个不错但简单的演示。值得一试。新手可以得到设计DTO的基本思路。http://www.codeproject.com/Articles/8824/C-Data-Transfer-Object以下是摘要:数据传输对象“DTO”是一个简单的可序列化对象,用于跨应用程序传输数据的多个层。DTO中包含的字段通常是原始类型,例如字符串、布尔值等。其他DTO可以包含在DTO中或聚合在一起。例如,您可能有一个包含在LibraryDTO中的BookDTO集合。我创建了一个由多个应用程序使用的框架,这些应用程序利用DTO跨层传输数据。该框架还依赖于其他OO模式,例如Factory、Facade等。DTO相对于DataSet的一大优势是DTO不必直接匹配DataTable或View。DTO可以聚合来自另一个DTO的字段这是所有数据传输对象的基类。使用系统;namespaceDEMO.Common{///这是所有DataTransferObjects的基类。publicabstractclassDTO{publicDTO(){}}}这是来自DTO的派生类:usingSystem;使用System.Xml.Serialization;使用DEMO.Common;namespaceDEMO.DemoDataTransferObjects{publicclassDemoDTO:DTO{//类封装的变量(私有)。私有字符串demoId="";私有字符串demoName="";私有字符串demoProgrammer="";publicDemoDTO(){}///DemoId字段的公共访问。///String[XmlElement(IsNullable=true)]publicstringDemoId{get{returnthis.demoId;}设置{this.demoId=value;}}///公开访问DemoId字段。///String[XmlElement(IsNullable=true)]publicstringDemoName{get{returnthis.demoName;}设置{this.demoName=value;}}///公开访问DemoId字段。///String[XmlElement(IsNullable=true)]publicstringDemoProgrammer{get{returnthis.demoProgrammer;}设置{this.demoProgrammer=值;}}}这是DTO的辅助类,它具有用于序列化和反序列化DTO的公共方法。使用系统;使用System.Xml.Serialization;使用System.IO;namespaceDEMO.Common{publicclassDTOSerializerHelper{publicDTOSerializerHelper(){}//////从给定的dto创建xml字符串。//////DTO///XMLpublicstaticstringSerializeDTO(DTOdto){尝试{XmlSerializerxmlSer=newXmlSerializer(dto.GetType());StringWritersWriter=newStringWriter();//将dto序列化为xml。xmlSer.Serialize(sWriter,dto);//返回xml的字符串。返回sWriter.ToString();}catch(Exceptionex){//传播异常。扔前;}}//////将xml反序列化为指定的数据传输对象。//////xml字符串///dto类型///DTOpublicstaticDTODeserializeXml(stringxml,DTOdto){try{XmlSerializerxmlSer=newXmlSerializer(dto.GetType());//读取XML。StringReadersReader=newStringReader(xml);//将反序列化的xml转换为dto的类型。DTOretDTO=(DTO)xmlSer.Deserialize(sReader);//返回数据传输对象。返回retDTO;}catch(Exceptionex){//传播异常。扔前;}}}现在开始顺序列表化/反顺序列表化:usingSystem;使用DEMO.Common;使用DEMO.DemoDataTransferObjects;namespaceDemoConsoleApplication{publicclassDemoClass{publicDemoClass(){}publicvoidStartDemo(){this.ProcessDemo();}privatevoidProcessDemo(){DemoDTOdto=this.CreateDemoDto();//将dto序列化为xml。stringstrXml=DTOSerializerHelper.SerializeDTO(dto);//将序列化的dto写入xml。Console.WriteLine("序列化DTO");Console.WriteLine("=======================");Console.WriteLine("r");控制台.WriteLine(strXml);Console.WriteLine("r");//将xml反序列化为数据传输对象。DemoDTOdesDto=(DemoDTO)DTOSerializerHelper.DeserializeXml(strXml,newDemoDTO());//写入反序列化的dto值。Console.WriteLine("反序列化DTO");Console.WriteLine("=======================");Console.WriteLine("r");控制台.WriteLine("DemoId:"+desDto.DemoId);Console.WriteLine("演示名称:"+desDto.DemoName);Console.WriteLine("DemoProgrammer:"+desDto.DemoProgrammer);控制台.WriteLine("r");}privateDemoDTOCreateDemoDto(){DemoDTOdto=newDemoDTO();dto.DemoId="1";dto.DemoName="数据传输对象演示程序";dto.DemoProgrammer="肯尼杨";返回数据;最后这段代码在主应用程序中执行staticvoidMain(string[]args){DemoClassdc=newDemoClass();dc.StartDemo();XmlSerializer或JsonSerializer可用于从源(webservice)XML或Json数据序列化(加载)或解释名称DTO:您将数据从源(webservice)序列化(传输)到(DTO)对象。因此,DTO是通用对象。有时使DTO对象尽可能宽并完全填充它是明智的,这样您就可以使用该对象中的任何内容并将其复制到您自己的“程序”对象中。示例:我开发了一个显示传输的导航数据的程序。我在DTO对象中序列化整个xml或json消息。这个DTO对象中有更多信息,然后我将在我的程序中需要它可以采用不同的形式,所以我将只使用需要的东西。DTO对象使从源(Web服务)中提取数据变得更加容易。由于名称“Auto”,我不想使用AutoMapper。我想知道我在做什么,并想一想我的数据将放在哪里。以上就是《C#学习教程:数据传输对象模式分享》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: