2012-04-24 12 views
6

私はWCFサービスを持っており、ビジネスオブジェクト用のDTOを作成しました。データ転送オブジェクト - 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; 
     } 
    } 
} 

は、私は(のDTOの知識を持たないビジネス・オブジェクト)での関心事の分離を好きですが、私はBのカプセル化(DTOにビジネス・オブジェクトの根性を公開する必要はありません)を好みます。

標準的な方法があるのか​​どうか疑問に思っていますか?

答えて

11

私はBOとDTOのどちらも別のクラスへの変換に関係していないので、これは別のクラスを必要とすると思います。

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

自分自身をマッピングしたい場合でも、マッピングの実装をDTOクラスとBOクラスから分離するために拡張メソッドを使用できます。

+0

本当に?私がビジネスオブジェクトを公開して、第3のクラスがマッピングを行うことができるようにするには、私はDTOでそれを行うかもしれません。まだ別のクラスを作成することは、私にかなり残忍なようです。私はautomapperを見ますが、ありがとう。 – GazTheDestroyer

+4

@ GazTheDestroyer:DTOは、データ転送が変換されないことを意味します。 DTOはその使用法、すなわちマッピングを意識しているとは考えられない。それはデータを転送し、消費者はデータをこれまでの目的、すなわちViewModelにマップするなどの目的で使います。あなたはDTOにマッピングを追加することは自由ですが、私の謙虚な意見では、あなたがDTOの意図された目的を誤って使用しているので、あなたのDTOはもはやDTOではありません。現在のプロジェクトでは、リポジトリがエンティティを生成します。 BLはエンティティを受け取り、DTOにマップします。 UIレイヤはBLを照会し、DTOを取得し、必要に応じてViewModelsにマッピングします。 – Nope

1

私はコンポーネントレイヤーをお勧めします。ビジネスレイヤとデータレイヤ間の通信には責任があります。この場合、DTOオブジェクトをビジネスオブジェクトに変換するために使用することができます。

+0

私の経験では、NetTiersはいくつかの優れた特質を持っていますが、実際にそれを使って作業するのはうんざりです。http://stackoverflow.com/questions/8220206/whither-nettiers –

+0

@DavidClarke参考文献は主にコンポーネントレイヤー。私が提供したリンクは壊れているので、削除します。 :) – Khan

0

あなたは、あなたが公有地にアクセスしてから何も表示されていない限り、「ビジネスオブジェクトをDTOに公開する必要はありません。あなたのような何かを行うことができますMSDN

その方法:さておき、代わりにクローンメソッドを持つのかわりにキャスト演算子を実装できるよう

人物P =(人)myPersonDTOを。

+0

はい、私の例はとてもシンプルでした。現実には私のビジネスオブジェクトには、マッピングのために公開したくない私的なものがあります。 – GazTheDestroyer

+1

BO上のものがプライベート/プロテクトされている場合は、それを使用するものは表示されませんので、その問題が何であるかはわかりません。 – Peter

関連する問題