数据传输对象模式

Dev*_*evT 14 .net c# design-patterns dto

对不起,我是企业应用程序的新手以及设计模式.可能是这个问题缺乏对设计模式的了解.我发现使用DTO传输数据更好.

我的业务实体类如下:

public class Patient
{    
    public string ID { get; set; }
    public string FullName { get; set; }
    public string FirstName { get; set; }
    public string Surname { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

所以在我的应用程序中,用户只能提供ID和HospitalID.所以它需要另一个Web服务并获取人员信息

 public class PersonDTO
 {
     public string NIC { get; set; }
     public string FullName { get; set; }
     public string FirstName { get; set; }
     public string BirthPlace { get; set; }
     public string BirthCertificateID { get; set; }
 }
Run Code Online (Sandbox Code Playgroud)

所以根据这些信息我去了Patient对象.(使用DTO模式)

所以我想写一个新类来转换如下.

public class PatientDO
{
    public static Patient ConvertToEntity(
        PatientRegistrationDTO pregDTO,
        PersonDTO person
    )
    {
        Patient p = new Patient();
        p.NIC = pregDTO.NIC;
        p.FullName = person.FullName;
        p.FirstName = person.FirstName;
        return p;
    }
}
Run Code Online (Sandbox Code Playgroud)

但最近我读了很少的文章,他们使用Serializer Helper class以及XmlSerializer我无法理解为什么他们使用这样的东西.

对于DTO模式,需要使用XmlSerializer以及为什么使用它?

Pau*_*lor 20

你应该看看AutoMapper.

http://automapper.org

这是一个软件,您可以将其包含在您的解决方案中,该软件会自动将值从一个类映射到另一个类.

它会自动映射具有相同名称的属性,并且在涉及子对象时也非常智能.但是,它还可在您需要时提供完整的映射控制.

编辑

几个示例来说明AutoMapper的工作原理.请注意我在现实生活中从不编码.简洁!

示例类.

// Common scenario.  Entity classes that have a connection to the DB.
namespace Entities 
{
   public class Manager
   {
      public virtual int Id { get; set; }
      public virtual User User { get; set; }
      public virtual IList<User> Serfs { get; set; }
   }

   public class User
   {
      public virtual int Id { get; set; }
      public virtual string Firstname { get; set; }
      public virtual string Lastname { get; set; }
   }
}



// Model class - bit more flattened
namespace Models 
{
   public class Manager 
   {
      public int Id { get; set; }
      public string UserFirstname { get; set; }
      public string UserLastname { get; set; }
      public string UserMiddlename { get; set; }
   }
}
Run Code Online (Sandbox Code Playgroud)

通常,您可以使用项目的一部分来配置所有AutoMapping.通过我刚刚给出的示例,您可以在Entities.Manager和Models.Manager之间配置映射,如下所示: -

// Tell AutoMapper that this conversion is possible
Mapper.CreateMap<Entities.Manager, Models.Manager>();
Run Code Online (Sandbox Code Playgroud)

然后,在您的代码中,您将使用类似的东西从Entity版本获取新的Models.Manager对象.

// Map the class
var mgr = Map<Entities.Manager, Models.Manager>
  ( repoManager, new Models.Manager() );
Run Code Online (Sandbox Code Playgroud)

顺便提一下,如果你一致地命名,AM足够聪明,可以自动解决很多属性​​.

上面的示例,应自动填充UserFirstname和UserLastname,因为: -

  • Manager有一个名为User的属性
  • 用户具有名为Firstname和Lastname的属性

但是,在Entities.Manager和Models.Manager之间进行映射后,Models.Manager中的UserMiddlename属性将始终为空,因为User没有名为Middlename的公共属性.

  • 请注意,您需要查看性能注意事项.您可以使用AutoMapper.不应该. (7认同)
  • 这可能是关于 automapper 的非常好的读物 http://www.devtrends.co.uk/blog/stop-using-automapper-in-your-data-access-code (2认同)