2013-09-23 15 views
1

在我们的团队中,我们使用请求和响应DTO,通过业务逻辑程序集的层次结构(超出了隔离的DB DTO)。JsonServiceClient方法和IReturn

我们要求在业务逻辑层没有SS依赖关系。

所以我们不使用IReturn或IReturnVoid接口。我们只使用简单的c#对象而没有继承。

至于路由,我们在AppHost.Configure中使用Fluent API,基本上创建一个路由表。

在我们的例子中,ServiceStack表现得非常好。

我们的Service.Model可以从业务逻辑层使用,无需依赖。

服务函数实际上是一个很薄的包装器,调用业务逻辑函数以返回响应DTO。

但是JsonServiceClient.Get函数只接受IReturn对象的参数,或者直接接受URI。

它不接受作为参数的对象,如Post函数。

有什么建议吗?

更新1

mythz

关于IReturn,不幸的是,在我们的例子还有未使用的业务逻辑模块,

甚至更​​轻SS依赖性要求。

服务功能是调用业务模块的薄包装器。

两层之间的链接只是请求和响应DTO。我们非常喜欢这种方法。

是的,它们是“消息操作”,但它们也作为应用程序层之间的消息。

另外我的客户主要是jQuery的Ajax,而不是C#。由于移动,绝大多数人倾向于Jquery Ajax。

因此,在我们的例子中,我们只能使用没有用IReturn标记的对象。 ServiceStack的表现非常好。

+0

我在G + ServiceStack社区发布了一个链接:https://plus.google.com/108232133950129763782/posts/Pcm2NjyvEGr可能希望将其移出SO,因为这不是一个真正的问题。 –

回答

1

该API仅接受IReturn<TResponse>以明确它只接受和使用请求DTO的,而不仅仅是任何DTO或对象。请求DTO是“消息操作”,不应该被重复用于其他任何事情,DTO类型可以是,但不是请求DTO,它是你的external facing service contract,不应该与任何其他问题耦合。

的DTO属性,如[Route]IReturn<T>[Api][Restrict]等是不能在C#来表达,但就像定义DTO属性的类型,它的静态元数据描述服务,如果只是额外的元数据你将它们归属于DTO,然后它们在客户端也变得可共享和反思。例如。ServiceClients将只能使用由[Route]定义的自定义路由,因为这是客户端唯一的信息,如果没有,它将最终回退到使用预定义的路由。

ServiceStack鼓励定义IReturn<T>标记,因为它允许您通过查看Request DTO来推断更多关于服务的信息,确保服务在返回相同类型(良好实践)时受到限制,并集中服务返回的内容而不是扩展到不同的(更详细/非DRY)呼叫站点,这也意味着如果您更改响应服务返回,您将得到编译器反馈哪些呼叫站点需要更新。不是每个人都知道这个信息/行为,这就是为什么ServiceStack希望通过鼓励使用IReturn<T>标记来鼓励这个“成功之坑”的发展,所以不是每个人都必须这样做。

至于依赖关系,您的DTO应该需要引用的唯一依赖项是ServiceStack.Interfaces.dll,它故意为轻量级,无impl的dll。在V3这需要引用ServiceStack.Common的NuGet PKG但V4我们将提供一个独立的ServiceStack.Interfaces的NuGet PKG提供最小/最轻的依赖你的DTO的可以参考一下。

+0

我用我的评论mythz更新了我的问题,谢谢。 – stefan2410