6

WCFサービスがあり、ビジネスオブジェクトのDTOを作成しました。

私の質問は、2つの間のマッピングをどこに置くかです。

A)DTOでは?

public class PersonDTO
{
    [DataMember] public string Id              { get; set; }
    [DataMember] public string Name            { get; set; }

    public void CloneFrom(Person p)
    {
        Id   = p.Id;
        Name = p.Name;
    }

    public void Populate(Person p)
    {
        p.Id   = Id;
        p.Name = Name;
    }
}

また

B)ビジネスオブジェクト内?

public class Person
{
    public string Id              { get; set; }
    public string Name            { get; set; }

    public void CloneFrom(PersonDTO dto)
    {
        Id   = dto.Id;
        Name = dto.Name;
    }

    public PersonDTO GetDTO()
    {
        return new PersonDTO()
        {
            Id   = Id;
            Name = Name;
        }
    }
}

私はAでの関心の分離が好きです(ビジネスオブジェクトはDTOの知識がありません)が、Bのカプセル化が好きです(ビジネスオブジェクトの内臓をDTOに公開する必要はありません)。

標準的な方法があるかどうか疑問に思いましたか?

4

3 に答える 3

11

BOもDTOも別のクラスへの変換に関与する必要がないため、これには別のクラスが必要だと思います。

私は個人的に、オブジェクトの変換にオートマッパーライブラリを使用しています。例のような単純な変換では、マッピングは1行のコードで実行されるため、複雑な変換も簡単に設定できます。

自分でマップしたい場合でも、拡張メソッドを使用して、マッピングの実装をDTOクラスとBOクラスから分離しておくことができます。

于 2012-04-24T14:02:08.233 に答える
1

コンポーネントレイヤーをお勧めします。それはあなたのビジネス層とあなたのデータ層の間のコミュニケーションに責任があるべきです。この場合、これを使用してDTOオブジェクトをビジネスオブジェクトに変換できます。

于 2012-04-24T14:03:17.333 に答える
0

パブリックプロパティにアクセスしているため、コードに表示されていないものがない限り、「ビジネスオブジェクトの内臓をDTOに公開する必要がない」という懸念は少し根拠がないようです。つまり、内臓はまったくありません。

余談ですが、クローンメソッドを使用する代わりに、キャスト演算子を実装できます。MSDN

そうすれば、次のようなことができます。Person p =(Person)myPersonDTO;

于 2012-04-24T14:06:47.190 に答える