2011-01-28 3 views
1

私は、DTOをドメインオブジェクトの対応物に変換するときにリポジトリを使用することが悪い設計であるかどうかを知りたいと思っています。リポジトリを使用したオブジェクトマッパー

私は、ORMのためのリポジトリ層とサービス層とef4を持つn層ウェブアプリケーションを構築しています。サービス層は、ドメインオブジェクトのDTOバージョンを公開します。サービスのコンシューマからDTOを受け取ると、サービスはAutoMapperを使用してDTOをドメインオブジェクトに変換します。

public class LogonEventDto 
{ 
    public DateTime Time 
    { 
     get; 
     set; 
    } 

    public Guid UserId 
    { 
     get; 
     set; 
    } 
} 

ドメインバージョン:

DTOバージョン - 今、ドメインオブジェクトのメンバプロパティのいくつかは、例えば、私は、以下のクラスを持って、データベースからロードする必要があります 今

public class LogonEvent { public DateTime Time { get; set; } public User User { get; set; } } 

、それはDOバージョンにDTOを変換することになると、私はUserRepositoryにGetById()メソッドを呼び出し、LogonEvent.Userプロパティウィットを設定する必要がありますh結果。

私は現在、サービスレイヤですべての変換ロジックを手動で行っています。

私が上記で尋ねたように、これは悪い設計の決定ですか、もしそうならばですか?

答えて

1

私はその常識をこのようにすると思います。社内の状態表現(ドメインモデル)とサービス契約(dto/data契約)を分離します。このようにして内部を公開することはなく、公共サービス契約に影響を与えずに実装をリファクタリングすることができます(マッピングがまだ可能であると仮定します)。

SOA(-isch)カスタマプロジェクトでこのパターンを使用しています。マッピングコードの生成に役立つツールもあります。

私はAutoMapperのファンではありません(コードは非常にクールです)。実行時にマッピングを指定する必要があるため(マッピングdefを構築するコードを書く必要があります)私の見解では、マッピングの定義は設計時のものです。そのため、コード生成ツールを構築しました。

  • 個別のレコードごとに(Idで)データをフェッチしないでください:私は次のように遭遇した私の経験で

    。代わりに、(データベース/データソース/他のWebサービスへの)1回のラウンドトリップで解決したいIdのリストをアセンブルし、検索したバッチを検索するだけです。

  • 多くのオブジェクトを持ち、ソースとターゲットの間に異なるクラス階層を持つ複雑なマッピングでは、マップしたもの、場所、方法の概要を把握することは難しいです。そのための実際の解決策はありません - それを助けるツールを作ることを除いて。

希望します。 Grtx、Marc