2011-11-24 3 views
1

.NET 4.0에서 WCF REST를 사용하고 있는데 다음 아이디어가 어떻게 구현 될 수 있는지 알아보기를 원했습니다.WCF REST 작업 상속

저는 EF 4.1 CF 프로젝트에 대해 매우 기본적인 POCO 세트를 가지고 있습니다. 그들 모두는 Entity 클래스 (PK를 정의하기위한 유일한 목적) 클래스로부터 상속받습니다.

public abstract Entity { 
    public int Id { get; set; } 
} 

지금, 대부분의 경우, 나는 (큰 시스템에 같아요, 또는 집계) 별도의 내 각 엔티티에 대한 CRUD 기능에 대한 작업을해야합니다.

[ServiceContract] 
public class UserService { 
    [OperationContract] 
    public void Add(User user) { 
     // commit to EF 
     fooContext.Users.Add(user); 
     fooContext.SaveChanges(); 
    } 
} 

지금, 이것은 단지 편의를 위해 주로,하지만 난 이런 걸 정말 편리 할 것이라고 생각했다 : 이론적으로 나를 http://<root>/userservice/add를 통해 해당 작업에 액세스 할 수 있도록 할

[ServiceContract] 
public abstract class BaseCrudService<T> where T : Entity { 
    [OperationContract] 
    public void Add(T entity) { 
     // commit to EF via generic methods 
     fooContext.Set<T>().Add(entity); 
     fooContext.SaveChanges(); 
    } 
} 

public class UserService : BaseCrudService<User> { 
    // blah 
} 

... ServiceContract로 장식 된 클래스를 상속받을 수 없다는 점을 제외하고는 예상대로 작동하므로 자동으로 엔드 포인트 자체로 계단식 연결 기능을 사용할 수는 없습니다.

궁금한 점은 : 어떻게 든 할 수있는 방법이 있습니까? 나는 상속 (이 방법으로)은 그것을 자르지 않을 것이라고 알고 있지만 이것을 할 수있는 다른 방법이 있습니까? 여러 서비스 작업에 걸쳐 유사한 코드 조각을 반복하는 것은 누군가가 이전에 생각해 보았을 것으로 생각되는 것처럼 들리며 구현 방법을 좀 더 명확하게합니다.

+0

아래의 내 솔루션 (user1039947)이 효과가 있습니까? 당신이 행복하다면 알고 싶습니다. – kmp

답변

3

당신은 당신이 할 수 있도록 어떤 서비스 계약과 같은 인터페이스를 사용할 수 있습니다 다음된다.

0 :

public abstract class BaseCrudService<T> where T : Entity 
{   
    public void Add(T entity) 
    { 
     // commit to EF via generic methods 
     fooContext.Set<T>().Add(entity); 
     fooContext.SaveChanges(); 
    } 
} 

public class UserService : BaseCrudService<User>, IUserService 
{ 
    // No need to put anything in here, just need a constructable class 
} 

// You would need to create an interface for each service you expose like so 
[ServiceContract] 
public interface IUserService 
{ 
    [OperationContract] 
    void Add(User entity); 
} 

가 그런 식으로 작업을 수행하고 코드를 복제 할 필요가 없습니다 완성도를 들어

, 여기에 설정입니다

<system.serviceModel> 
    <bindings /> 
    <services> 
    <service name="Demo.UserService"> 
     <endpoint address="" 
       behaviorConfiguration="json" 
       binding="webHttpBinding" 
       name="jsonEndpoint" 
       contract="Demo.IUserService" /> 
    </service> 
    </services> 
    <behaviors> 
    <endpointBehaviors> 
     <behavior name="json"> 
     <webHttp/> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 
</system.serviceModel> 
+0

이것은 단 하나의 변경으로 완벽하게 작동했습니다. 인터페이스를 일반 인터페이스 (예 : 인터페이스 IUserService T : Entity)로 선언하고 기본 서비스를 상속 받았다. 제네릭 형식에 대해 동일한 클래스를 사용하는 서비스 계약입니다. 감사! –

1

AFAIK, 제네릭 on 서비스 조작을 사용할 수 없습니다. :(

당신은 UserServicepublic void Add(T entity)에 래퍼를 추가 할 수 있습니다 ...하지만 당신의 제네릭 기반 프레임 워크의 목적을 물리 칠 것이다.