2011-02-25 2 views
0

오늘이 문제로 고생하고 있습니다.API 디자인 : 데이터 영역 개체를 사용하거나 복사/복제 하시겠습니까?

웹 기반 응용 프로그램 다시 작성; 나는 그런 방법으로이 작업을 수행하고 싶습니다 :

  • 모든 거래는 웹 서비스 API를 통해 이동 (같은 것을 http://api.myapplication.com) 고객은 데이터로 작업 할 수 있도록 우리가 제공하는 것과 동일한 방식으로/제공되는 웹 인터페이스를 통해 수행 할 수있는 모든 작업은 프로그래밍 방식으로도 수행 할 수 있습니다.
  • 이 질문과 관련이없는 몇 가지 설계상의 이유로 클래스 라이브러리는 데이터 계층 (SQL + Entity Framework)의 역할을합니다.

문제는 내가 Entity Framework 객체를 노출하지 않기로 결정한 경우입니다. 웹 서비스 인 을 사용하면 Entity Framework 객체의 "API"버전을 다시 만든 다음 속성을 앞뒤로 복사하는 모든 "프록시"코드를 쓸 수 있습니다..

여기에서 가장 좋은 방법은 무엇입니까? 그것을 빨아 들이고 각 객체에 대한 API 모델 클래스를 만들거나 Entity Framework 버전 만 사용합니까?

이 길 아래에 있었고 버전/하위 호환성, 다른 두통을 다루는 여러분의 바로 가기가 여기 있습니까?

는 편집 : 피드백 후, 무슨 일이 더 의미가있을 수 있습니다 :

  • 데이터/서비스 레이어 - 공개 웹 인터페이스를 직접뿐만 아니라 웹 서비스 API
  • 웹에서 사용하는 DLL 서비스 API - API 특정 객체 및 프록시 코드가 포함 된 거의 모든 서비스 계층 메소드/객체의 복제본
+0

"고객 서비스에 영향을 미칠만한 결정을 내릴 때 우리는 고통을 느낄 수 있습니다." – Brandon

+0

고객에게 제공하는 것과 동일한 서비스 계층을 사용하는 것이 좋지만 WCF 전송없이 직접 사용해야합니다 (직접 서비스 메서드 호출). –

+0

조금만 설명하면 : WCF는 각 요청 주위에 엄청난 양의 추가 "래핑"을 추가합니다. 웹 사이트가 끊임없이이 랩핑을 작성하고 유선을 통해 전송하면 내부 네트워크 트래픽이 급격히 증가 할 수 있으므로 인위적으로 시스템의 가용성을 저하시킬 수 있습니다. 그것은 의미가 없으며 일반적으로 눈살을 찌푸리게됩니다. – NotMe

답변

2

API 용 웹 서비스 인터페이스를 통해 웹 사이트 게시물 데이터를 가지지 않습니다. 그렇게하면 주요 웹 사이트의 잠재적 인 성능 문제가 발생할 수 있습니다. 깨어있는 API 변경 사항을 배포하는 즉시 기본 웹 사이트를 다시 배포해야합니다. 당신이 이것을 강요하고 싶지 않은 이유가 있습니다.

대신 웹 사이트 및 웹 서비스 모두 기본 비즈니스/데이터 계층과 직접 통신해야합니다.

다음으로 EF 개체를 노출하지 마십시오. 웹 서비스 인터페이스는 이보다 깨끗해야합니다. 즉, 가능한 한 백엔드와 작업하는 작업을 시도하고 단순화해야합니다. 이 부분에 상당한 노력이 필요합니까? 예. 그러나 현재 연결된 고객에게 영향을 미치지 않으면 서 모델을 약간 변경해야 할 때 배당금을 지불하게됩니다.

+0

quote "대신 귀하의 웹 사이트 및 웹 서비스는 모두 기본 비즈니스/데이터 계층과 직접 통신해야합니다." 나는 그가 동일한 서비스 레이어 (데이터 레이어 아님)를 사용한다고 말하고 싶다. 그리고 그는 내부적으로 WCF를 사용하지 않는다고 생각한다. 그는 단지 동일한 서비스 메소드를 호출한다. –

+0

@Alex Burtsev : 그의 의견에 따르면 ... – NotMe

+0

은 성능 문제가 발견되면 더 나은 웹 서비스를 만들어야한다는 "문제"가 아닙니다. devs가 고객이 사용할 수없는보다 효율적인 내부 메소드를 위해 웹 서비스를 제쳐두고 막으려 고 시도했습니다. – Brandon

0

프로젝트의 복잡성과 얼마나 오래 살아야하는지에 따라 다릅니다. 작고 짧은 생활 프로젝트의 경우 모든 계층의 도메인 개체를 공유 할 수 있습니다. 그러나 그것이 큰 프로젝트라면, 그것이 잘되고, 잘 작동하고, 다음 5 년 동안 업데이트 할 것을 기대합니다. ...

현재 큰 프로젝트인데, 나는 모든 레이어에서 공유 된 엔티티로 시작했습니다. 그럼 내가 프레 젠 테이션을위한 별도의 엔티티가 필요하다는 것을 발견하고 지금 (6 개월이 지났음) 각 레이어 (지속성, 서비스, 도메인, 프리젠 테이션)에 대해 별도의 클래스를 사용하고 있는데, 그건 내가 편집증이거나 규칙을 따르고 있기 때문이 아닙니다. 그냥 여러 레이어에 걸쳐 한 세트의 클래스로 모든 작업을 할 수는 없습니다 ... 결론을 내리십시오 ..

PS Automapper 및 Value Injecter와 같이 객체를 변환하는 데 도움이되는 도구가 있습니다.

0

난 그냥 응용 프로그램의 요구를 겨냥한 API를 작성하고 작성합니다. 전체 DB 레이어가 노출되는 정도는 의미가 없습니다. 앱을 작동 시키려면 노출 될 필요가있는 것만 노출하면됩니다.

관련 문제