web-dev-qa-db-ja.com

クラスを別のクラスに、またはその逆に変換する

Campaignというドメインクラスがあります。

Class Campaign {
    public long CampaignID { get; set; }
    public string CampaignName { get; set; }
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; }
}

さらに、Asp.net MVCを使用しており、モデルクラスを定義しました。

[DataContract]
public class CampaignModel
{
    [DataMember(Name="id")]
    public long Id { get; set; }

    [DataMember(Name = "name")]
    public string CampaignName { get; set; }

    [DataMember(Name = "isDummy")]
    public bool IsDummy { get; set; }
} 

私の目標は、あるクラスから別のクラスに、またはその逆に変換することです。

REST私のAngular 2アプリからの呼び出し。

私のアプリには2つの使用例があります。1つはキャンペーンの作成です。そのため、CampaignModelからCampaignクラスに変換し、キャンペーンを保存する必要があります。 2番目の使用例は、既存のキャンペーンをUIにロードすることです。そのため、キャンペーンからCamapignModelに変換します。

  • それが問題である場合、2つの間の会話は簡単ではなく、複雑なデータ構造を使用する必要があります。

私はいくつかのオプションを考えました:

  1. CampaignModelに2つのメソッドを作成します。

    public Campaign Convert();
    public CampaignModel Convert(Campaign);
    
  2. 別のクラスを作成します。 CampaignConverter

  3. 2つの間の変換を容易にする専用の既知のライブラリ、または既知の設計パターンを使用しますか?
  4. 他のアイデアは?

ありがとう

3
MasterOfPuppets

これが単純なキャストジョブの場合(そうではないようです)、明示的な演算子を使用します。これについて MSDNドキュメント にいくつかの素晴らしい例があります:

// Must be defined inside a class called Fahrenheit:
public static explicit operator Celsius(Fahrenheit fahr)
{
    return new Celsius((5.0f / 9.0f) * (fahr.degrees - 32));
}

このキャストは、キャストの宛先であるclientクラスで行われます。ソースは誰がそれを消費するかを知る必要はありません。適切なキャストを行うのは消費者の責任です。

しかし、あなたの質問のこの部分は私に考えさせられました:

それが問題である場合、2つの間の会話は簡単ではなく、複雑なデータ構造を使用する必要があります。

この変換が複雑で時間がかかり、IOが含まれ、例外が発生する傾向がある場合、最善の方法は、Businessレイヤー(またはDomainレイヤー内)、変換を実行し、起こり得る例外を適切に処理します。

ただし、データコントラクトは境界にあるため、ドメインモデルの内部には含めないでください。そして、「 境界では、アプリケーションはオブジェクト指向ではありません 」です。

4
Machado