3

嗨,我有一个执行方法的类库,并且有许多不同的类用作方法调用的参数……我正在为这个类库创建一个 wcf 包装器。但我无权更改类库。

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

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

谢谢

4

4 回答 4

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; }
  }
}
于 2011-03-17T19:39:44.550 回答
2

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

于 2011-03-17T19:39:46.553 回答
1

从 .Net 3.5 SP1 开始,您不再需要指定 DataContract。您可以简单地使用 ServiceContract 中的类。

如需完整解释,请查看此相关问题,其中讨论了何时使用和何时不使用 DataContract 及其后果。

于 2016-04-18T22:35:36.347 回答
-2

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

于 2011-03-17T19:33:11.407 回答