【问题标题】:ResponstDTO with complex Property in ServiceStackServiceStack 中具有复杂属性的 ResponstDTO
【发布时间】:2014-05-15 07:27:55
【问题描述】:

拥有一个具有复杂属性的响应,我想正确映射到我的 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;
    }
}

现在 Genre 和 Location 都是具有简单属性(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 - 我虽然喜欢这种抽象和“分离”。

谢谢

【问题讨论】:

标签: c# rest servicestack dto


【解决方案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 响应并映射其中的所有内容,甚至是嵌套的资源。这非常有效且灵活

【讨论】:

    【解决方案2】:

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

    我只是分享一些与 SS 相关的经验,但您可能可以指定哪些方法不适合您。是否抛出异常或其他原因。

    【讨论】:

    • 现在,我使用 JsonObject 作为返回值,然后使用带有 Object().ArrayObject(..).ConvertAll 或 ConvertTo 或 Get 等的 lambda 表达式。目前,这非常灵活,并且非常适用于复杂类型。一件好事是使用任何类型的“jsontToModelX”之类的 lambda 函数,因此当不同的 DTO 具有嵌套对象时,您可以重用它们。有了这种方法,我根本不使用 AutoMapper。只需 ServiceStack.Text 并从 JsonObject 映射到 DomainModel
    猜你喜欢
    • 2014-01-12
    • 2018-10-06
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    相关资源
    最近更新 更多