4

2つのオブジェクトがあるとします。

class Order
{
    string Name {get; set;}
    Customer Customer {get; set;}
    Item[] Items {get; set;}
}

class OrderDTO
{
    string Name {get; set;}
    CustomerDTO Customer {get; set;}
    ItemDTO[] Items {get; set;}
}

orderDTO完全に入力されたオブジェクトを受け取った場合orderDTO.TranslateTo<Order>()、結果はName入力されただけで、CustomerまたはではありませんItems。再帰的な翻訳を行う方法はありますか、それとも唯一のオプションは顧客と各アイテムを手動で翻訳することです。

4

2 に答える 2

5

これを再利用可能な拡張メソッドでラップします。例:

public static OrderDTO ToDto(this Order from)
{
    return new OrderDTO { 
        Name = from.Name,
        Customer = from.ConvertTo<CustomerDTO>(),
        Items = from.Items.Map(x => x.ConvertTo<ItemDTO>()).ToArray(),
    }
}

これは、Order DTOにマップする必要があるときにいつでも呼び出すことができます。例:

return order.ToDto();

ServiceStackの自動マッピングのその他の例は、wikiで入手できます

ServiceStackのパーティラインは、マッピングが自動マッパーから推測できるデフォルトの従来の動作よりも多くを必要とする場合、マッピングに必要な拡張とカスタマイズがコードできれいに表現され、簡単に維持されるように、DRY拡張メソッドの背後にラップする必要があります。これは、ServiceStackの多くの場合に推奨されます。たとえば、あいまいな重量のIOC機能に依存するのではなく、コードで従来とは異なる複雑なIOCバインディングを維持します。

もちろん、必要に応じて、AutoMapperなどのサードパーティツールを採用することもできます。

于 2013-03-14T14:45:21.907 に答える
3

複雑なマッピングを自分で明示的に処理する必要があります。これは、複雑な型が現在どのように処理されているかを示すServiceStacksrcの単体テストです。

CarオブジェクトがJSONにシリアル化されていることがわかります。

var user = new User() {
    FirstName = "Demis",
    LastName = "Bellot",
    Car = new Car() { Name = "BMW X6", Age = 3 }
};

var userDto = user.TranslateTo<UserDto>();

Assert.That(userDto.FirstName, Is.EqualTo(user.FirstName));
Assert.That(userDto.LastName, Is.EqualTo(user.LastName));
Assert.That(userDto.Car, Is.EqualTo("{Name:BMW X6,Age:3}"));

私はTrustMeに同意します-私はAutomapperを使用する価値のある医者です。組み込みの翻訳は、依存関係を減らすように設計されています。

于 2013-03-14T13:57:44.777 に答える