在ServiceStack中使用复杂属性的ResponstDTO

时间:2014-05-15 07:27:55

标签: c# rest servicestack dto

Havin a具有复杂属性的响应,我想正确地映射到我的responseDTO。对于所有基本类型,它完美无缺。

ResponseDTO如下所示:

public class ResponseDto
{
    public string Id {
        get;
        set;
    }

    public struct Refs
    {
        public Genre GenreDto {
            get;
            set;
        }

        public Location LocationDto {
            get;
            set;
        }
    }

    public Refs References {
        get;
        set;
    }
}

类型和位置都适用于具有简单属性的简单类(int / string)

公共类GenreDto {

    public string Id {
        get;
        set;
    }
    public string Name {
        get;
        set;
    }

}

问题: 有没有办法,没有changing/replacing通用的反序列化器(以及更具体的example)(在本例中为JSON)来映射这些复杂的属性? 与GithubResponse示例的一个具体区别是,我不能使用一种类型的词典,因为我在引用下有不同的类型。这就是为什么我使用结构,但这似乎不起作用。也许只允许IEnumerable?

更新 有一种方法可以使用lamda expressins手动解析json github.com/ServiceStack/ServiceStack.Text/blob/master/tests/ServiceStack.Text.Tests/UseCases/CentroidTests.cs#L136但是我真的想避免这种情况,因为ResponseDTO以这种方式变得有点无用 - 因为在编写这种手动映射时,我不再需要Automapper从ResponseDto映射到DomainModel - 我喜欢这种抽象和“分离”。

由于

2 个答案:

答案 0 :(得分:1)

我使用lambda表达式来解决这个问题,一个更复杂的例子是

static public Func<JsonObject,Cart> fromJson = cart => new Cart(new CartDto {
        Id = cart.Get<string>("id"),
        SelectedDeliveryId = cart.Get<string>("selectedDeliveryId"),
        SelectedPaymentId = cart.Get<string>("selectedPaymentId"),
        Amount = cart.Get<float>("selectedPaymentId"),
        AddressBilling = cart.Object("references").ArrayObjects("address_billing").FirstOrDefault().ConvertTo(AddressDto.fromJson),
        AddressDelivery = cart.Object("references").ArrayObjects("address_delivery").FirstOrDefault().ConvertTo(AddressDto.fromJson),
        AvailableShippingTypes = cart.Object("references").ArrayObjects("delivery").ConvertAll(ShippingTypeDto.fromJson),
        AvailablePaypmentTypes = cart.Object("references").ArrayObjects("payment").ConvertAll(PaymentOptionDto.fromJson),
        Tickets = cart.Object("references").ArrayObjects("ticket").ConvertAll(TicketDto.fromJson)
    });

因此,这个lamda exprpession用于解析请求的JsonObject响应并将所有内容映射到内部,甚至是嵌套的ressources。这非常灵活,而且非常灵活

答案 1 :(得分:0)

前段时间我偶然发现了类似的问题。实际上,ServiceStack可以很好地处理复杂的属性。我的方案中的问题是我从数据库中获取数据并将从数据库提供程序返回的对象直接传递给ServiceStack。解决方案是从数据库提供程序返回的模型中创建DTO,或者在相同模型上调用.ToList()。

我只是与SS分享一些经验,但您可以指定哪些不适合您。是否抛出异常或其他内容。