2012-11-30 2 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()); 
은/reqstars 경로에 GET 웹 요청을

. 사용자 지정 경로가 클라이언트에 없으면 자동으로 ServiceStack의 미리 정의 된 경로를 사용합니다.

내 질문은 "대부분 출발이없는"어셈블리가 여전히 DTO 클래스에 대한 경로 속성이 때문에 ServiceStack에 대한 종속성을 필요로 않습니다 ...인가?

답변

7

[Route] 속성은 ServiceStack.Interfaces 프로젝트에 존재하는, 그래서 당신은 여전히 ​​의존성 및 IMPL없는 ServiceStack.Interfaces.dll에 대한 참조가 필요합니다. 이것은 의도적으로 가능한 한 최소한의 의존성을 보장하기 위해서입니다. 그래서 Interfaces 프로젝트에서 DTO에 사용할 수있는 모든 메타 데이터 특성을 유지하려고합니다.

DTO를 별도의 어셈블리에 보관하려는 이유는 클라이언트가 DTO를 사용하기 위해 필요한 종속성을 줄이기 위해서입니다. 이로 인해 클라이언트의 침입이 적고 액세스가 용이 해집니다. 또한 DTO는 서비스 계약을 대표하므로 별도로 유지하면 구현과 분리하여 좋은 결과를 얻을 수 있습니다.

+1

mythz. 나는 DTO를 별도의 어셈블리에 보관하는 데 찬성합니다. 어셈블리를 제로 - 디프 로프 할 수있는 방법이 있는지 확실하지 않았습니다. –

+0

@mythz 저는 ServiceStack에 경외감을 가지고 있습니다. 많은 양의 정보에 압도당했습니다 (많은 모순이 있음). 이 대답은 내 DTO를 사용하여 ServiceModel dll을 만드는 데 올바른 길을 찾는데 도움이되었지만 ServiceStack의 doc에서 그런 식으로 가리키는 것을 찾지 못했습니다. 필요한 유일한 참조는 ServiceStack.Interfaces입니다. RESTIntro ServiceModel에는 많은 DLL에 대한 참조가 포함되어 있으므로 혼란 스럽습니다. ServiceModel을 빌드하기위한 최소 기본 참조 만 얻는 너겟 패키지가 있습니까? – Loudenvier

+1

@Loudenvier ServiceStack.Interfaces는 ServiceStack.Common NuGet 패키지에 있으며, 현재 NuGet에서 더 세분화 된 것은 없습니다 (큰 NuGet 다시 인수 이후에있을 것입니다). 'ServiceStack.Common'은 클라이언트가 [ServiceStack의 typed .NET 클라이언트] (https://github.com/ServiceStack/ServiceStack/wiki/C%)를 사용할 수있게하는 데 필요한 최소 패키지이므로 실제로는 문제가되지 않습니다. 23 클라이언트). 일반적으로 고객이 필요로하는 deps/마찰을 최소화하면서 서비스 모델을 무료로 유지하도록 노력해야합니다. – mythz