it-swarm.com.ru

Шаблон объекта передачи данных

мне жаль, что я новичок в корпоративных приложениях, а также в шаблоне дизайна. может быть, этот вопрос происходит из-за отсутствия знаний о шаблоне проектирования. я обнаружил, что лучше использовать DTO для передачи данных.

мой бизнес-класс, как показано ниже:

public class Patient
{    
    public string ID { get; set; }
    public string FullName { get; set; }
    public string FirstName { get; set; }
    public string Surname { get; set; }
}

поэтому в моем приложении пользователь только дает ID и HospitalID. поэтому он требует другого веб-сервиса и получить информацию о человеке

 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; }
 }

поэтому на основании этой информации я собираюсь к пациенту объекта. (Используя шаблон 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;
    }
}

но в последнее время я прочитал немного статей и они использовали Serializer Helper class так же как XmlSerializer, я не могу понять, почему они использовали что-то подобное. 

для шаблона DTO, что нужно использовать XmlSerializer и почему он используется?

13
DevT

Вы должны действительно взглянуть на 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; }
   }
}

Как правило, у вас есть часть вашего проекта для настройки всего вашего AutoMapping. С примерами, которые я только что дал, вы можете настроить карту между Entities.Manager и Models.Manager следующим образом: -

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

Затем в своем коде вы будете использовать что-то подобное, чтобы получить новый объект Models.Manager из версии Entity.

// Map the class
var mgr = Map<Entities.Manager, Models.Manager>
  ( repoManager, new Models.Manager() );

Кстати, AM достаточно умен, чтобы автоматически разрешать многие свойства, если вы называете вещи последовательно.

Пример выше, UserFirstname и UserLastname должны быть заполнены автоматически, потому что: -

  • Менеджер имеет свойство под названием Пользователь
  • У пользователя есть свойства с именем и фамилией

Однако свойство UserMiddlename в Models.Manager всегда будет пустым после операции сопоставления между Entities.Manager и Models.Manager, поскольку у пользователя нет открытого свойства Middlename.

19
Paul Alan Taylor

В CodeProject есть хорошая, но простая демонстрация. Это достойно того, чтобы пройти через это .. Новички могут получить общее представление о разработке DTO.

http://www.codeproject.com/Articles/8824/C-Data-Transfer-Object

Вот краткое содержание:

Объект передачи данных «DTO» - это простой сериализуемый объект, используемый для передачи данных между несколькими уровнями приложения. Поля, содержащиеся в DTO, обычно представляют собой примитивные типы, такие как строки, логические значения и т.д. Другие DTO могут содержаться или объединяться в DTO. Например, у вас может быть коллекция BookDTO, содержащаяся в LibraryDTO. Я создал структуру, используемую несколькими приложениями, которая использует DTO для передачи данных между уровнями. Инфраструктура также опирается на другие шаблоны OO, такие как Factory, Facade и т.д. Одна из замечательных особенностей DTO по сравнению с DataSet состоит в том, что DTO не обязательно должно напрямую соответствовать таблице данных или представлению. DTO может объединять поля из другого DTO

Это базовый класс для всех объектов передачи данных.

using System;

namespace DEMO.Common
{
/// This is the base class for all DataTransferObjects.
    public abstract class DTO
    {
        public DTO()
        {
        }
    }
}

Это производный класс от DTO:

using System;
using System.Xml.Serialization;
using DEMO.Common;

namespace DEMO.DemoDataTransferObjects
{
public class DemoDTO : DTO
{
    // Variables encapsulated by class (private).
    private string demoId = "";
    private string demoName = "";
    private string demoProgrammer = "";

    public DemoDTO()
    {
    }

    ///Public access to the DemoId field.
    ///String
    [XmlElement(IsNullable=true)]
    public string DemoId
    {
        get
        {
            return this.demoId;
        }
        set
        {
            this.demoId = value;
        }
    }

    ///Public access to the DemoId field.
    ///String
    [XmlElement(IsNullable=true)]
    public string DemoName
    {
        get
        {
            return this.demoName;
        }
        set
        {
            this.demoName = value;
        }
    }

    ///Public access to the DemoId field.
    ///String
    [XmlElement(IsNullable=true)]
    public string DemoProgrammer
    {
        get
        {
            return this.demoProgrammer;
        }
        set
        {
            this.demoProgrammer = value;
        }
    }

}

Это вспомогательный класс для DTO. У него есть открытые методы для сериализации и десериализации DTO.

using System;
using System.Xml.Serialization;
using System.IO;

namespace DEMO.Common
{
public class DTOSerializerHelper
{
    public DTOSerializerHelper()
    {
    }

    /// 
    /// Creates xml string from given dto.
    /// 
    /// DTO
    /// XML
    public static string SerializeDTO(DTO dto)
    {
        try
        {
            XmlSerializer xmlSer = new XmlSerializer(dto.GetType());
            StringWriter sWriter = new StringWriter();
            // Serialize the dto to xml.
            xmlSer.Serialize(sWriter, dto);
            // Return the string of xml.
            return sWriter.ToString();
        }
        catch(Exception ex)
        {
            // Propogate the exception.
            throw ex;
        }
    }

    /// 
    /// Deserializes the xml into a specified data transfer object.
    /// 
    /// string of xml
    /// type of dto
    /// DTO
    public static DTO DeserializeXml(string xml, DTO dto)
    {
        try
        {
            XmlSerializer xmlSer = new XmlSerializer(dto.GetType());
            // Read the XML.
            StringReader sReader = new StringReader(xml);
            // Cast the deserialized xml to the type of dto.
            DTO retDTO = (DTO)xmlSer.Deserialize(sReader);
            // Return the data transfer object.
            return retDTO;
        }
        catch(Exception ex)
        {
            // Propogate the exception.
            throw ex;
        }            
    }

}

Теперь начните сериализацию/десериализацию:

using System;
using DEMO.Common;
using DEMO.DemoDataTransferObjects;

namespace DemoConsoleApplication
{
public class DemoClass
{
    public DemoClass()
    {
    }

    public void StartDemo()
    {
        this.ProcessDemo();
    }

    private void ProcessDemo()
    {
        DemoDTO dto = this.CreateDemoDto();

        // Serialize the dto to xml.
        string strXml = DTOSerializerHelper.SerializeDTO(dto);

        // Write the serialized dto as xml.
        Console.WriteLine("Serialized DTO");
        Console.WriteLine("=======================");
        Console.WriteLine("\r");
        Console.WriteLine(strXml);
        Console.WriteLine("\r");

        // Deserialize the xml to the data transfer object.
        DemoDTO desDto = 
          (DemoDTO) DTOSerializerHelper.DeserializeXml(strXml, 
          new DemoDTO());

        // Write the deserialized dto values.
        Console.WriteLine("Deseralized DTO");
        Console.WriteLine("=======================");
        Console.WriteLine("\r");
        Console.WriteLine("DemoId         : " + desDto.DemoId);
        Console.WriteLine("Demo Name      : " + desDto.DemoName);
        Console.WriteLine("Demo Programmer: " + desDto.DemoProgrammer);
        Console.WriteLine("\r");
    }

    private DemoDTO CreateDemoDto()
    {
        DemoDTO dto = new DemoDTO();

        dto.DemoId            = "1";
        dto.DemoName        = "Data Transfer Object Demonstration Program";
        dto.DemoProgrammer    = "Kenny Young";

        return dto;
    }
}

Наконец этот код выполняется в основном приложении

static void Main(string[] args)
{
    DemoClass dc = new DemoClass();
    dc.StartDemo();
}
3
Venugopal M

XmlSerializer или JsonSerializer можно использовать для сериализации (загрузки) данных XML или Json из источника (веб-службы). Или объясняя имя DTO: вы сериализуете (переносите) данные из источника (веб-службы) в (общий DTO) объект. Таким образом, DTO являются объектами общего назначения. Иногда разумно создать максимально широкий объект DTO и заполнить его полностью, чтобы вы могли использовать из этого объекта все, что захотите, и скопировать его в свои «собственные» программные объекты.

Пример: я разработал программу для отображения навигационных данных транспорта. Я сериализую весь xml или json сообщение в объекте DTO. В этом объекте DTO больше информации, чем мне потребуется в моей программе, и она может быть в другой форме, поэтому я буду использовать только то, что нужно. Объекты DTO облегчают извлечение данных из источников (веб-сервисов).

Я не хочу использовать AutoMapper из-за названия «Авто». Я хочу знать, что я делаю, и думать, куда будут поступать мои данные.

1
Herman Van Der Blom