19

申し訳ありませんが、私はエンタープライズ アプリケーションとデザイン パターンの初心者です。この質問は、設計パターンに関する知識が不足しているために発生する可能性があります。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 のみを指定します。そのため、別の 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; }
 }

これらの情報に基づいて、患者オブジェクトに移動します。(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を使用する必要があり、なぜそれが使用されるのですか?

4

3 に答える 3

27

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>();

次に、コードで、次のようなものを使用して、Entity バージョンから新しい Models.Manager オブジェクトを取得します。

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

ちなみに、AM は、一貫した名前を付ければ、多くのプロパティを自動的に解決できるほどスマートです。

上記の例では、UserFirstname と UserLastname が自動的に入力される必要があります。理由は次のとおりです。

  • Manager には User というプロパティがあります
  • ユーザーには Firstname と Lastname というプロパティがあります

ただし、Models.Manager の UserMiddlename プロパティは、Entities.Manager と Models.Manager の間のマッピング操作の後、常に空白になります。これは、User には Middlename というパブリック プロパティがないためです。

于 2013-02-06T08:33:04.083 に答える
4

CodeProject には、素晴らしくシンプルなデモがあります。それを通過する価値があります。初心者は、DTO を設計するための基本的なアイデアを得ることができます。

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

内容の要約は次のとおりです。

データ転送オブジェクト「DTO」は、アプリケーションの複数のレイヤー間でデータを転送するために使用される単純なシリアル化可能なオブジェクトです。DTO に含まれるフィールドは、通常、文字列、ブール値などのプリミティブ型です。他の DTO が含まれているか、DTO に集約されている場合があります。たとえば、LibraryDTO に含まれる BookDTO のコレクションがあるとします。DTO を利用して層を越えてデータを転送する複数のアプリケーションで使用されるフレームワークを作成しました。このフレームワークは、Factory、Facade などの他の OO パターンにも依存しています。DataSet と比較して DTO が優れている点の 1 つは、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();
}
于 2015-04-23T04:43:54.800 に答える
2

XmlSerializer または JsonSerializer は、ソース (Web サービス) から XML または Json データをシリアライズ (ロード) するために使用できます。または、名前 DTO の説明: ソース (Web サービス) から (一般的な DTO) オブジェクトにデータをシリアル化 (転送) します。したがって、DTO は汎用オブジェクトです。可能な限り広い DTO オブジェクトを作成し、それを完全に埋めて、そのオブジェクトから好きなものを使用し、それを「独自の」プログラムオブジェクトにコピーできるようにするのが賢明な場合があります。

例: 交通機関のナビゲーション データを表示するプログラムを開発しました。DTO オブジェクトで xml または json メッセージ全体をシリアル化します。この DTO オブジェクトには、プログラムで必要な情報よりも多くの情報が含まれており、別の形式にすることもできるため、必要なものだけを使用します。DTO オブジェクトを使用すると、ソース (Web サービス) からデータを簡単に抽出できます。

「Auto」という名前のため、AutoMapper を使用したくありません。自分が何をしているのかを知りたいし、自分のデータがどこに行くのかを考えたい.

于 2013-10-02T10:59:02.510 に答える