7

以下のコードを考えてみましょう (簡略化されています)。それぞれが独自の特定のインターフェイスを実装する特定の DTO オブジェクトのリストを返すサービス クラスがあります。実際のコードでは、レガシー コードを使用しているため、Dataset を反復処理することによってこれらのデータが取り込まれます。

質問:

  1. DTO を新しくしたり、Service Locator アンチパターンを使用したりせずに、DTO を作成/使用するにはどうすればよいですか? コンポジション ルートで空の DTO オブジェクトを作成し、コンストラクターを介してそれを Service クラスに挿入することは、あまり意味がありません。実際には、リストを作成するときに DTO を一種の一時変数として使用するからです。

  2. コードでは、DTO を新しくする私の例を見ることができます。しかし、これは、最初から DTO にインターフェイスを実装させない場合よりも気分が良くありません。では、インターフェイスを実装すべきではないので、DTO で DI を使用しないでください。


public class Services : IServices
{    
    public IList<IDTO> GetDTOs()
    {    
        ...
        List<IDTO> dtos = new List<IDTO>();
        foreach (c in d) 
        {
            DTO dto = new DTO();
            dto.x = c.x;
            dto.y = c.y;
            dto.z = c.z;
            dtos.Add(dto);
        }
        return dtos;
    }    
}
4

3 に答える 3

16

DTOにDIを使用することは私にはあまり意味がありません。おそらくファクトリパターンを使用して、モデルオブジェクトのDTOを取得します。

DTOは、コンテナーによって管理されるライフサイクルを必要としません。私は彼らだけだろうnew。過剰なエンジニアをしないでください。

于 2011-06-09T18:18:40.997 に答える
8

DTO は変更される動作を実装する可能性が低いため、インターフェイスを実装する必要はないと思います。

また、注射するべきではありません。すべてのオブジェクトがそうである必要はありません。これは new の適切な呼び出しだと思います: オブジェクトを作成し、それを使用し、スコープ外に出して GC します。

于 2011-06-09T18:19:48.183 に答える
1

AutoMapperを見てください。そして、私は@duffymoに同意します。DTOとのインターフェースは使用しません。AutoMapper は、DTO を作成および設定する規則ベースのオブジェクトからオブジェクトへのマッパーです。他に何もなければ、多くのタイピングを節約できます。関連するタイプミスを伴う DTO との間の変換ルーチンを作成する演習を行ってきました。AutoMapper をもう少し早く見つけていたらよかったのにと思います。あなたの例の場合(名目上、タイプ Order の「from」オブジェクトを作成した場合):

public class Services : IServices
{    
    public IList<DTO> GetDTOs()
    {    
        ...
        Mapper.CreateMap<Order, DTO>(); // move map creation to startup routine
        var dtos = new List<DTO>();
        foreach (c in d) 
        {
            dtos.Add( Mapper.Map<Order, DTO>(c));
        }
        return dtos;
     }
}

またはLINQを使用して

public class Services : IServices
{    
    public IList<DTO> GetDTOs()
    {    
        ...
        Mapper.CreateMap<Order, DTO>(); // move map creation to startup routine
        return d.Select(c => Mapper.Map<Order, DTO>(c)).ToList();
     }
}
于 2011-12-21T23:54:56.667 に答える