2011-11-24 59 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(); 
    } 
} 

现在,这主要是只是为了方便,但我在想,这样的事情会很方便:

[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 
} 

...这将在理论上允许我通过http://<root>/userservice/add访问操作并按照我的预期工作,除了我不能继承一个ServiceContract修饰的类,所以没有希望自动级联到端点本身。

我想知道:有没有办法做到这一点?我知道继承(以这种方式)不会削减它,但有没有其他方法可以做到这一点?在多个服务操作中重复类似的代码片段听起来像是人们以前会想到的东西,并形成了一个更清晰的实现操作方式。

+0

下面的解决方案适用于您(来自user1039947)吗?我很想知道你是否满意 – kmp

回答

3

您可以使用一个接口作为一个服务合同,你可以这样做什么如下:。

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:实体'),并且继承了基础服务和服务契约使用相同的类为通用类型。谢谢! –

1

AFAIK,在服务操作上使用泛型是不可能的。 :(

你可以包装在UserService添加到您的public void Add(T entity) ...但是,这会破坏你的仿制药为基础的框架的目的。