2013-08-22 5 views
3

저는 (Windows) sysadmin 배경을 가진 C# 코더입니다. 다양한 인프라 구성 요소 (Windows 관리, 하드웨어 관리 등)에 대한 통합 REST-API를 만들기 위해 다양한 서비스 프레임 워크를 살펴 보았습니다. 나는 이것을위한 프레임 워크로 ServiceStack을 사용하여 해결했지만, 나의 DTO를 관리하는 방법에 대해서는 질문이있다. 대개 내 원본 데이터는 다음과 같은 비 데이터베이스 개체에서 가져온 것입니다.ServiceStack 및 비 데이터베이스 개체

  • 기타 웹 서비스 (일반적으로 SOAP 기반). 나는 보통 "Add Web Reference"(대부분은 아니지만 전부는 아님)를 통해 이들을 가져옵니다.
  • .NET 개체 (일반적으로 WMI/WinRM이/PowerShell을 [System.Management], 또는 Active Directory [System.DirectoryServices]) ... 어떤 불행한 경우
  • 원시 텍스트 출력은 내가 호출의 결과로 얻을 수 명령 (ssh 또는 cmd를 통해).

이 모든 경우에 속성을 업데이트하기 위해 일종의 Save() 메서드를 호출해야합니다. 또한 REST 서비스에 공개하고자하는 CRUD가 아닌 메소드가있을 수 있습니다. 일반적으로 소스 데이터의 모든 것을 필요로하지는 않습니다 (예를 들어, 웹 서비스 데이터의 경우 특정 프록시 클래스의 특정 속성과 메서드를 복싱하는 데만 관심이 있습니다). 나의 이해는 나의 DTO는 깨끗해야하고 어떤 의존성도 없어야한다는 것이다. 내가 사용할 수있는 ORM이 없다고 생각하기 때문에 데이터를 DTO에 매핑하는 데 어떤 디자인 패턴을 사용해야합니까? 내가 백엔드 서비스와 다양한 데이터 소스와 함께 어떤 용어 ...

답변

2

을 오용하고있어 경우

죄송합니다, 나는 그것을 DTO들에 데이터를 매핑하는 높은 프레임 워크 같은 구조 아무것도 사용하기 어려울 것이라고 생각 . 나는 간단하게 다음과 같습니다 백엔드 클래스의에서

Keep your DTO classes separate합니다. 일반적으로 DTO에서 코드 재사용, 상속 사용 등의 시도에 저항하십시오 (DTO 구현을위한 인터페이스를 선언하는 것이 유용 할 때도 있음). 이렇게하면 ServiceStack 서비스의 인터페이스를 깨끗하게 유지하고 백엔드 세부 정보와 독립적으로 유지할 수 있습니다.

쉽게 두 클래스 사이에 속성을 매핑 할 ServiceStack에서 사용할 수있는 몇 가지 확장 방법이 있습니다 : TranslateTo, PopulateWith, PopulateWithNonDefaultValues 등 위의 링크가 이러한 언급. 트릭은 DTO 클래스가 백엔드 클래스의 하위 클래스가 아니거나 직접 백엔드 클래스를 재사용해서는 안되지만 이러한 매핑 메소드를 사용하려면 속성 이름이 일치하는 것이 편리하다는 것을 알 수 있습니다.

단순하게 ServiceStack 서비스 클래스를 유지; 주요 책임은 DTO 클래스와 하위 모델 클래스 사이를 변환하고 실제 작업을 수행하기 위해 비즈니스 논리 클래스에 대해 하나 또는 두 개의 메소드 호출을 수행해야합니다.

ServiceStack 서비스와 상호 작용하는 클래스 인 비즈니스 계층의 최상위 레벨이 특정 유형의 소스 및 형식에 대한 세부 정보를 추상화하는 깨끗한 인터페이스를 제공하는 데 유용 할 것 같습니다. 데이터의. 따라서 모델 클래스의 세 가지 레이어가 필요할 수 있습니다. 위에서 아래로 : DTO, 비즈니스 계층 POCO 클래스, 웹 참조 생성 코드 또는 기타와 같은 특정 백엔드 서비스를위한 프레임 워크 특정 클래스.

나는 그게 거기에있다에 대한 모든 것 같아요.

0

나는 당신이 당신의 API의 요구 사항을 충족하고 실제 객체와 DTO들 사이에 중재는 '비즈니스 로직'레이어를 DTO들을 정의하는 것이 좋습니다.

ServiceStack 서비스는 DTO 정의와 비즈니스 로직 계층 모두에 종속되며 비즈니스 로직 계층은 DTO 정의 및 실제 개체 정의에 종속됩니다. 결과적으로 REST 서비스와 DTO는 실제 API에 대한 외관으로 작동합니다.

+0

@esker는 내가 할 수있는 것보다 더 좋고 (그리고 더 빠르다고) 말했다. 그가 한 말. –