1

複数のWCFサービスで構成されるアプリケーションをセットアップしていますが、そのうちの1つだけがデータベースにアクセスできます。データのチャンクをDTOで、場合によっては一括で渡します。一括操作は1つのパラメーターが同じままであると想定しているため、次のパターンが好きです。

private void UpdateItems(long clientId, ItemDto[] items);

ただし、 Martin Fowlerによると、DTOは「通話のすべてのデータを保持できる」オブジェクトとして定義されています。これは、DTOの外部に追加のデータを渡してはならないことを意味しますか?私は本当に以下のようなパターンを見るべきですか?私にとってはパラメータのポイントを打ち負かすようです。

private void UpdateItems(ItemsDto itemsDto);

ItemsDto {
    long ClientId;
    ItemDto[] Items;
}
4

1 に答える 1

3

マーティン・ファウラーは素晴らしいと思いますが、「ファウラーが言ったので」絶対に何もしたくありません。本当に必要なのは、なぜ彼がそのアドバイスをしたのかを考え、それらの理由があなたに当てはまるかどうかを確認することです。

ここで複数項目のDTOを作成すると、バッチ操作の引数を変更する必要がある場合に、インターフェイスを変更する必要がなくなります。

たとえば、clientTimeStampパラメータに追加する必要がある場合は、次のようになります。

private void UpdateItems(long clientId, DateTimeOffset clientTimeStamp, ItemDto[] items);

またはこれ:

private void UpdateItems(ItemsDto itemsDto);

ItemsDto {
    long ClientId;
    DateTimeOffset clientTimeStamp;
    ItemDto[] Items;
}

また、引数をDTOにパックする拡張メソッドを作成することで、古いインターフェイスを日常的に使用できることに注意してください。

では、どのようなメリットがありますか?違いは、メソッドがパブリックで多くのクライアントによって使用されている場合、2番目の方法で下位互換性を維持できることです。コードを変更するのも少し簡単ですが、VSとresharperを使用すると、実際には大きな違いはありません。コストは、作成する追加のコードの量です(例ではかなり小さいですが、実際のコードベースではおそらく大きいです)。

直接制御できないクライアントコード(作成したが何らかの理由で更新できない可能性があるクライアントを含む)が予想される場合、ここでのDTOはおそらくコストに見合う価値があります。それ以外の場合は、次にパラメーターを追加するまでそのままにしておきます。

于 2013-02-24T14:17:31.623 に答える