继承WCF REST操作

时间:2011-11-24 08:25:40

标签: wcf generics wcf-rest

我正在使用.NET 4.0上的WCF REST,我最终想知道以下想法是否有可能实现?

我有一套针对EF 4.1 CF项目的非常基本的POCO。所有这些都继承自基类Entity类(仅用于定义PK)。

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

现在,在大多数情况下,我将为每个实体(或聚合,我想在更大的系统上)进行单独的CRUD功能操作。

e.g。

[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 - 装饰类,所以有没有希望将功能自动级联到端点本身。

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

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

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

您可以在public void Add(T entity)中为UserService添加一个包装器......但这会破坏基于泛型的框架的目的。