Подтвердить что ты не робот

Схема объекта передачи данных

Мне жаль, что я новичок в корпоративных приложениях, а также в шаблоне дизайна. может быть, этот вопрос происходит из-за отсутствия знаний о шаблоне проектирования. я обнаружил, что лучше использовать 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 и почему он используется?

4b9b3361

Ответ 1

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

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

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

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

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

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

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

  • У менеджера есть свойство User
  • Пользователь имеет свойства, называемые Firstname и Lastname

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

Ответ 2

В 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

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

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

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