2011-02-11 2 views
5

전체 주제의 길이에 대해 먼저 사과하겠습니다. 상당히 길지만, 메시지가 오류없이 분명하게 전달되기를 바랍니다.OData WCF 데이터 서비스와 NHibernate 및 기업 비즈니스 로직

여기에는 회사의 기존 ASP.NET WebApplication이 있습니다. .NET Framework 3.5 SP1에서 C# ASP.NET으로 작성되었습니다. 얼마 전에 브라우저에 의존하지 않고 외부 당사자가 응용 프로그램과 통신 할 수 있도록 WCF 및 SOAP를 사용하여이 웹 응용 프로그램 용 초기 API를 개발했습니다.

이 API는 잠시 동안 살아 났지만 결국 요청은 RESTfull이었고 새로운 기술에 의존하는 새로운 API를 만들게되었습니다. 이 과제를 부여 받았고 ASP.NET MVC 프레임 워크를 사용하여 ASP.NET 웹 응용 프로그램 내에서 실행되는 초기 API를 만들었습니다. 처음에는 제대로 작동하기까지 약간의 시간이 걸렸지 만 지금은 리소스를 자세히 설명하는 XML을 받기 위해 애플리케이션에서 REST 호출을 할 수 있습니다.

저는 Microsoft WebCamp에 참석했으며 OData 개념으로 즉시 판매되었습니다. 우리가하고있는 것과 매우 유사했지만 이것은 우리 자신의 구현 대신에 더 많은 플레이어가 지원하는 프로토콜이었습니다. 현재 PoC (Proof of Concept)를 사용하여 OData 프로토콜과 WCF DataService 기술을 사용하여 개발 한 API를 다시 작성하고 있습니다.

데이터 서비스와 함께 NHibernate 2를 사용하기 위해 인터넷을 검색 한 후 들어오는 쿼리 요청을 Google에 매핑하여 내부 비즈니스 계층에서 엔티티를 읽을 수있는 API의 ReadOnly 버전을 만드는 데 성공했습니다. 비즈니스 계층입니다. 그러나 OData 프로토콜을 사용하여 엔티티를 만들 수있는 기능적 API를 원합니다. 이제는 진행 방법에 조금 얽혀 있습니다. 나는 다음 기사를 읽었습니다 : http://weblogs.asp.net/cibrax/default.aspx?PageIndex=3

위의 문서는 멋지게 사용자 정의 DataService를 NHibernate 레이어에 매핑하는 방법을 잘 설명합니다. 나는 이것을 계속 사용하기위한 기반으로 사용했지만 NHibernate를 사용하여 데이터베이스에 직접 요청을 매핑하고 싶지는 않지만 "비즈니스"계층에 매핑하려고합니다 (별도의 DLL)는 액세스, 권한 및 트리거에 기반하여 검사, 제약 조건 및 업데이트의 대량 배치를 수행합니다.

내가 물어보고 싶은 것은, 예를 들어 위의 articly처럼 내 자신의 NhibernateContext 클래스를 만들고 대신 NHibernate 세션 대신 우리의 비즈니스 계층에 의존한다. 나는 아마도 런타임에 작업하고있는 객체의 유형을 파악하고 올바른 비즈니스 클래스를 호출하여 업데이트 및 삭제를 수행하기 위해 리플렉션에 의존해야 할 것입니다. 그래서 것이 일을

       *-----------------* 
           * Database  * 
           *-----------------* 

           *------------------------* 
           * DAL(Data Access Layer) * 
           *------------------------* 

           *------------------------* 
           * BUL (Bussiness Layer) * 
           *------------------------* 
           *---------------* *-------------------* 
           * My OData stuff* * Internal API  * 
           *---------------* *-------------------* 

               *------------------* 
               * Web Application * 
               *------------------* 

을하거나, 성능은 쓸모 만들 것 :

는에 작은 아스키 그림으로 보여주기 위해? 아니면 여기에 공이 없습니까? OData WCF DataService의 BUL & DAL 계층에 저장된 모든 논리를 다시 사용하고자합니다.

Data.Services 네임 스페이스의 EntityModel 클래스를 상속하는 새 클래스를 만들고 BUL & DAL & API 레이어에 대한 모든 호출을 표시하는 새 DataService 개체를 만들려고했습니다. 그러나 나는 자원을 만들고 삭제하는 요청을 가로 챌 곳/사람을 알지 못합니다.

내가 설명하려고하는 것이 분명하고 누군가가 나를 도울 수 있기를 바랍니다.

+0

매우 유용한 기사 위의 링크 수정 (소스 등 포함) http://weblogs.asp.net/cibrax/archive/2010/08/13/nhibernating-a-wcf-data-service.aspx – paulecoyote

답변

1

악마는 세부 사항에 있지만, 사용자가 제안해야하는 디자인처럼 들릴 수 있습니다.

DataService 클래스는 모든 사람, 구성 설정 및 사용자 지정 작업에 적용 할 수있는 액세스 권한을 정의하는 곳입니다. 이 시나리오에서는 데이터 컨텍스트 (DataService의 'T')에 더 집중할 것입니다.

문맥에 대한 두 가지 근본적인 경로가 있습니다. 읽기 및 쓰기입니다. 읽기는 IQueryable 진입 점을 통해 발생합니다. LINQ 제공자를 작성하는 것은 좋은 일이다. 그러나 NHibernate는 이미 이것을 지원한다. 그러나 우리가 DAL 엔티티를 호출하는 것으로 상상할 수는있다. 데이터베이스가 이해할 수있는 용어로 쿼리 인터셉터를 표현할 수 있다면 여기에서 액세스 인터셉터를 사용할 수 있습니다.

업데이트 경로는 더 많은 비즈니스 로직 (유효성 검사, 추가 업데이트 등)을 실행하려는 위치에서 이해할 수있는 경로입니다. 이렇게하려면 IUpdatable 구현 (최신 버전을 사용하는 경우 IDataServiceUpdateProvider)에 집중해야합니다. 여기서는 DAL 개체 또는 비즈니스 개체가 될 수있는 원하는 개체를 사용할 수 있습니다. DAL에서 모든 작업을 수행 한 다음 SaveChanges()에 대한 유효성 검사를 실행하거나 비즈니스 개체의 유효성을 검사하는 경우 비즈니스 개체의 모든 작업을 수행 할 수 있습니다.

한 종류의 대상에서 다른 대상으로 '이동할'수있는 곳은 두 곳입니다. 하나는 GetResource() API에 있는데, 아마도 DAL 엔티티의 용어로 IQueryable을 얻을 것입니다. 다른 하나는 ResolveResource()에 있는데, 런타임에서 IQueryable에서 가져 오는 것처럼 직렬화 할 객체를 요청하고 있으므로 DAL 엔티티 일 수도 있습니다.

희망 사항 - 균일하지 않은 API를 통한 균일 액세스가 어려울 수 있지만 그만한 가치가 있습니다.

+0

예 , 그 길을 따라 가고 싶었습니다. 그러나 이것은 또 다른 질문으로 나를 남겨 둡니다. 내가 게시 한 링크에서 인터페이스는 메서드의 "개체"클래스와 함께 작동합니다. 리플렉션을 사용하거나 URL을 파싱 한 다음 올바른 개체 모델로 개체를 캐스팅하여 올바른 개체를 파생시킬 수 있습니까? 또는 모든 엔터티에 대해 특정 DataService 구현을 만들고 onRequest 메서드를 오버로드하여 올바른 인스턴스를 만들어야합니까? 여기서 일반적인 구현에 대해 생각해보고 클래스 유형에 따라 올바른 비즈니스 로직을 호출하십시오. –