Wcf datacontract库中的类,我无法修改

时间:2011-03-17 19:23:24

标签: .net wcf datacontracts

我有一个类库,它执行方法并有很多不同的类,它们用作方法调用的参数... 我正在为这个类库创建一个wcf包装器。但我没有权限更改类库。

现在我的问题是如何轻松地将这些类作为数据合同/数据库公开?

我有大约100个不同的类,我需要这些方法。

由于

4 个答案:

答案 0 :(得分:2)

如果你真的无法更改库,那么我相信你通过WCF公开类的唯一选择是为每个方法创建包装器对象。我会考虑为此任务编写代码生成器。

您可以反映要公开的程序集中的类型集,以获取所需的类型元数据信息。

您可以使用类似t4模板(VS 2008及更高版本的一部分)和T4 Toolbox之类的内容来创建代码生成器来为您编写代码。一旦生成器完成,如果您的库已经更改,应该很容易再次重新运行。修复错误更新代码生成器并重新运行它也很容易。

我提到的另一个选项只是为了完整性而且有一些棘手的问题,就是反汇编和修补有问题的代码。您可以使用类似ildasm的东西来转储程序集的il,添加必要的WCF归属,然后使用ilasm重新组装它。但是,这个过程可能容易出错,只要程序集发生变化,您就必须重做流程,根据谁拥有程序集的IP,可能存在法律问题,并且您必须重新签署程序集,如果它需要是一个强名称的程序集,则可能使用不同的加密证书。

*编辑*

请求的包装器代码示例:

public class ToWrap {
  public String Name { get; set; }
  public String Address { get; set; }
}

[DataContract]
public class Wrapper {
  private ToWrap _wrapped;

  // constructor for WCF marshalling
  public Wrapper() {
    _wrapped = new ToWrap();
  }

  public Wrapper(ToWrap wrapped) {
    _wrapped = wrapped;
  }

  [DataMember]
  public String Name {
    get { return _wrapped.Name; }
    set { _wrapped.Name = value; }
  }

  [DataMember]
  public String Address {
    get { return _wrapped.Address; }
    set { _wrapped.Address = value; }
  }
}

答案 1 :(得分:1)

如果这些类被标记为[Serializable],那么您仍然可以在WCF ServiceContract中使用它们,但如果它们不是,那么就没有简单的方法可以做到这一点。您别无选择,只能创建一组具有相同属性的新类,然后在每次要调用其中一个库时将它们逐个属性复制到库的等效项中#& 39;功能。

答案 2 :(得分:1)

从.Net 3.5 SP1开始,您不再需要指定DataContract。您只需使用ServiceContract中的类。

有关完整说明,请查看this related question,其中讨论何时使用以及何时不使用DataContract及其后果。

答案 3 :(得分:-2)

我从未尝试过,但您可以尝试使用分部类和部分方法添加属性。