有没有办法在WCF中的DataContract实体上使用自定义基类?

时间:2011-07-19 20:13:53

标签: wcf datacontract

有没有办法在客户端的数据合同实体下使用基类?在生成的代码中,它显式地从object继承。我有一个基类,我在我的应用程序架构中使用它来执行交叉任务。我想通过使他们成为部分类来将我现有的业务对象集成到WCF服务中。它运行得非常好,除了我似乎无法使用我想要的基类。

3 个答案:

答案 0 :(得分:1)

不,我不相信使用标准代理生成器是可行的。 XSD代码生成器不指定实际的基类,也不允许通过参数指定一个。

我相信你看到的输出是由于用于实际代码生成的CodeDom类,它们支持各种语言。看来C#生成器在没有类继承的情况下将其转换为Object的显式继承。这是不幸的,因为如果不这样做,你可以使用部分课来做你想要的。

我认为最简单的解决方案是使用“搜索和替换”,或者在更新服务引用后编写宏来执行此操作。

答案 1 :(得分:0)

在您的应用程序中,在服务上创建基类,在其定义上添加一些known types并在客户端部分实现扩展它是否有意义?

答案 2 :(得分:0)

您还可以在客户端向类添加功能。使用哪一个取决于您正在寻找的用例。

如果您只想将新方法添加到类的客户端版本中,则可以使用分部类直接向生成的类添加新方法。

如果你想在客户端有多个对象共享一组方法,以便可以多态访问它们,那么你可以使用部分类向定义新方法的类添加一个接口,创建一个提供的辅助类方法定义,然后委托给实现ineterface的每个DataContract对象中的helper类。

public interface IDoStuff 
{
  void DoStuff()
}

public interface IDoStuffContext
{
  int Data {get;}
  string Value {set;}
}

public class DoStuffHelper
{
  private IDoStuffContext _wrapped;
  public DoStuffHelper(IDoStuffContext wrapped) 
  {
    _wrapped = wrapped;
  }

  public void DoStuff() {
      if(_wrapped.Data == 10) {
         _wrapped.Value = "Hello World";
      }
  }
}

public partial class MyDataContract1 : IDoStuff
{
  private DoStuffHelper _helper = new DoStuffHelper(this);

  public void DoStuff() {
    _helper.DoStuff();
  }
}

public partial class MyDataContract2 : IDoStuff
{
  private DoStuffHelper _helper = new DoStuffHelper(this);

  public void DoStuff() {
    _helper.DoStuff();
  }
}