5

最近、私たちのコードでこのパターン (?) に出くわしました。BlazeDS を使用した Spring アプリと Flex フロントエンドがあります。次のように、DTO でインターフェイスを使用することが決定されました。

ジャワ


public interface ISomeDTO {
       Integer setId();
       void getId(Integer i);
}

public class SomeDTO implements ISomeDTO
{
..
}


アクションスクリプト


public interface ISomeDTO {
       var id:Integer;
}

public class SomeDTO implements ISomeDTO
{
..
}


DTO のインターフェースは何をもたらしますか? これらは、ロジックがまったくない軽量オブジェクトです。DTO は理にかなっており、インターフェイスは理にかなっていますが、一緒ではありません。

4

2 に答える 2

3

トランザクションベースの環境では、DTOを使用して、データベースエンティティを基盤となるdbセッションから分割します。

これらのセッションは通常利用できず、ほとんどのエンティティはメンバーコレクションを遅延ロードするプロキシで構成されています。したがって、プロキシされたエンティティのコレクションプロパティにアクセスする場合、プロキシはこの時点でコレクションをロードします。データベーストランザクションが存在するかどうかは関係ありません。したがって、アクティブなトランザクションがない場合、エンティティメンバーのアクセスによって障害が発生する可能性があります。

まさにこれは、メンバーにアクセスしようとするビューにエンティティを転送するときに発生します。トランザクション処理は通常、サービスレイヤーで定義されるため、ビュー/コントローラーにはアクティブなトランザクションはありません。

この問題を回避するには、さまざまなアプローチがあります。

  • 厳密に言えば、これはアンチパターンですが、たとえばフィルターメカニズム(SpringのOpenSessionInViewFilter)を使用してセッションを開いたままにします。
  • DAOが、すでに初期化されている必要なメンバーで満たされたデータ転送オブジェクトを返すようにします

これがお役に立てば幸いです。

于 2010-01-22T02:44:42.480 に答える
3

インターフェイスと DTO が連携しない理由がわかりません。

DTO からドメイン オブジェクトを作成するファクトリ/アセンブラを考えてみましょう。指定された DTO のタイプに基づいてドメイン オブジェクトの特定の実装を作成できるように、戦略を使用してファクトリを構成できます。DTO は、理想的には、ここでインターフェイスに入力されます。(これは逆方向にも機能します)。

すべての DTO をインターフェイスの背後に配置する必要があると言っているわけではありませんが、ドメイン オブジェクトの場合と同様に、そうすることが有益な場合もあります。

于 2010-01-22T09:14:42.063 に答える