2012-11-30 49 views
7

我们正在构建我们的ServiceStack的第一个小实现,我们需要对位于客户端和服务器之间共享的单独程序集中的DTO进行一些说明。ServiceStack DTO汇编

The WIKI page for the new API建议DTO

下在服务发展你的服务的DTO提供要保持清洁,并为“依赖性的自由”,尽可能为最大的可访问性和潜在的重新您的技术无关的服务层-使用。我们的建议是将您的服务DTO保存在一个单独的大部分免费的程序集中。

也有此片段

*但是,假设你需要复制的DTO的正常路线(以二进制形式的任何来源),所以你有这样的事情在客户端上:

[Route("/reqstars")] 
public class AllReqstars : IReturn<List<Reqstar>> { } 

The code on the client now just becomes: 

var client = new JsonServiceClient(BaseUri); 
List<Reqstar> response = client.Get(new AllReqstars()); 

这点让GET web请求到/ reqstars路线。当客户端上没有自定义路由时,它会自动回退到使用ServiceStack的预定义路由。

我的问题是......由于DTO类的路由属性,“大部分无需释放”的程序集仍然需要依赖于ServiceStack吗?

回答

7

[Route]属性存在于ServiceStack.Interfaces项目,所以你仍然只需要依赖并实现了一套无ServiceStack.Interfaces.dll参考。这是设计的,我们希望确保尽可能少的依赖性,这就是为什么我们会尽量保留您可能在Interfaces项目中使用DTO的所有元数据属性。

之所以希望保持您的DTO在一个单独的组件,以降低成本,以使用它你的客户所需要的依赖关系。这使得客户的侵入性更小,更易于访问。此外,您的DTO代表您的服务合同,保持其独立性,鼓励他们脱离实施的良好实践,您希望继续自由地重新考虑实施。

+1

谢谢mythz。我全部赞成将DTO保存在一个单独的程序集中,但我不确定是否有一种方法可以使程序集零点归零。 –

+0

@mythz我对ServiceStack很敬畏,并且信息量(很多矛盾)有点不知所措。这个答案帮助我在正确的轨道上用我的DTO创建一个ServiceModel DLL,但是我没有在ServiceStack的文档上找到任何指向它的东西。没有任何地方指出唯一需要的引用是ServiceStack.Interfaces。 RESTIntro ServiceModel包含对大量DLL的引用,所以它也很混乱。是否有nuget包只获得这个最小的引用来构建ServiceModel? – Loudenvier

+1

@Loudenvier ServiceStack.Interfaces位于ServiceStack.Common NuGet包中,NuGet目前没有更好的细节(在NuGet的重新设计之后会有更多细节)。在实践中,这不是问题,因为ServiceStack.Common是客户端使用[ServiceStack键入的.NET客户端]所需的最小包(https://github.com/ServiceStack/ServiceStack/wiki/C% 23客户端)。一般来说,您应该努力保持您的服务模式不受干扰,最大限度地减少客户所需的代价/摩擦。 – mythz