【问题标题】:Use an existing Poco as a ServiceStack DTO使用现有的 Poco 作为 ServiceStack DTO
【发布时间】:2013-03-20 11:35:06
【问题描述】:

我喜欢使用新的 api i ServiceStack,并在一个遗留项目中有一些 Pocos,我喜欢保持不变。但是,在我的 ServiceStack 项目中将它们复制到 Dto 感觉有点不妥。我可以偷懒并以某种方式将属性“传递”给我的遗留 pocos 吗?

这适用于 JsonServiceClient,但为 json 添加了额外的级别,我不喜欢:

[Route("/legacytype", "POST,OPTIONS")]
public class RequestLegacyTypePost : IReturn<int>
{
    public LegacyTypeLegacyType{ get; set; }
}

public class LegacyTypeService : Service
{
    public object Post(RequestLegacyTypePost request)
    {
        return db.Insert(request.LegacyType);
    }
}

将属性复制并粘贴到 DTO 方式自然可以正常工作:

[Route("/legacytype", "POST,OPTIONS")]
public class RequestLegacyTypePost : IReturn<int>
{
    public int Id { get; set; }
    public string SomeProp { get; set; }
    public string OtherProp { get; set; }
}

也许这就是最佳实践?

【问题讨论】:

    标签: servicestack


    【解决方案1】:

    ServiceStack 允许您将任何现有的 Poco 重新用作请求 DTO,如果您不想修改现有的旧版 dll,那么您可以在 AppHost.Configure() 中使用 Fluent API 以非侵入方式添加路由:

    Routes
        .Add<LegacyTypeLegacyType>("/legacytype", "POST,OPTIONS");
    

    【讨论】:

    • 我测试了 BiffBaffBoffs 的建议,它似乎拾取了继承模型的道具,非常整洁,该方法有什么我现在看不到的缺点吗?
    • 作为权宜之计,在请求 DTO 上并不是真正的继承工作正常,我只是一般不喜欢 recommending inheritance inside DTOs
    • 好的,知道了。当我使用 Routes.Add 时,甚至可以让新的 api 获取 LegacyType 路由映射吗?所以我可以使用 JsonServiceClient, client.Post(legacyTypeObject)
    • 是的,您可以使用任何 POCO 作为您的服务模型,问题是如果它不在 impl and dep-free dll 中,那么尝试在您的客户端上重新使用它们可能会强制与仅服务器类和逻辑耦合,这通常不适合泄漏到您的客户端应用程序中。
    • 对! DTO 项目不应该依赖于我的 poco 项目。很有道理。
    【解决方案2】:

    您还可以将模型继承到自定义 DTO 中,例如:

    [Route("/legacytype", "POST,OPTIONS")]
    RequestLegacyTypeDTO : LegacyType, IReturn<int> { }
    

    这将使您无需更改即可访问原始 LegacyType 模型的所有属性。

    【讨论】:

    • 这很好用!但是对于干净的代码,我知道我首先错了,因为我的 DTO 项目依赖于我的遗留项目。
    猜你喜欢
    • 1970-01-01
    • 2012-11-21
    • 2015-11-02
    • 1970-01-01
    • 2010-11-15
    • 2012-04-10
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多