【问题标题】:Expose 3rd party interface (over WCF) to Silverlight向 Silverlight 公开第 3 方接口(通过 WCF)
【发布时间】:2010-08-12 15:05:45
【问题描述】:

我搜索了很多,如果我遗漏了一些明显的东西,我深表歉意。感谢您阅读下面的冗长文字。

我在这里有一个第 3 方(阅读:无法访问/更改源)应用程序。它由一个服务器(Windows 服务)和一个 API 组成,该 API 通过远程处理与服务器通信。 出于几个原因,我想通过 WCF 公开这个 API(参见主题:一个原因是 WCF 客户端)。

问题是,API 是

  1. 不可更改(遵循第 3 方规则)
  2. 不使用 WCF 本身(它是可序列化的/MarshalByRef 在远程处理需要时)
  3. 使用大量接口和内部实现类

在 1 之后,我自己不能使用(相当侵入性的)WCF 属性。

在 2 之后,API 本身可以“通过网络”使用(它们支持通过 TCP 和 HTTP 进行远程处理),但远程处理对我来说还不够好。

在 3 之后,我主要有接口(WCF 不能很好地处理,不能(反)序列化)。可以发送实现类,但是 - 我无法访问它们。

此 API 的一般用法是基于单个接口(及其成员/属性),因此典型用法如下

var entryPoint = new ApiClientEntryPoint();
entryPoint.SomeMethodCall();
entryPoint.PropertyExposingAnInterface.SomeOtherMethodCall();

等等。

我真正想做的是生成(尽可能少的努力/代码)我通过 WCF 公开的代理(不是典型的 WCF 意义上的),并序列化此层次结构,映射每个调用/属性客户端到服务器上的真实事物。

到目前为止,我最接近的是偶然发现this project,但我想知道是否有更多/其他可用的工具可以让我完成这项工作的中大部分。

如果有任何一般性的其他建议,更好的方法将预先存在且不可更改的东西包装到 WCF 中,请分享。

【问题讨论】:

    标签: c# silverlight wcf remoting


    【解决方案1】:

    我的建议是使用外观模式。创建特定于您的使用的新 WCF 服务并包装第 3 方服务。客户会与您的服务交谈,而您会与第 3 方交谈。但客户不会直接与第 3 方对话。

    这适用于大多数但不是所有情况。我不确定你的具体情况,所以 YMMV。

    顺便说一句,您可以查看 WCF RIA 服务,该服务非常适合将服务公开给 Silverlight,您可以避免对服务内容进行大量手动编码。但同样取决于您的特定情况,这可能不是最好的方法。

    编辑:
    现在很明显,API 太大和/或客户端的使用模式太多样化,无法有效地使用外观。我唯一可以建议的另一件事是使用代码生成工具。使用反射(假设它是一个 .NET API?)分解 API,然后使用您收集的详细信息生成新服务。您可以查看 Visual Studio 中内置的 T4 模板,也可以查看更“强大”的工具,例如 CodeSmith。但我猜这将是一些痛苦的代码。我不知道有一个自动化的解决方案。

    API 是否有据可查?如果是这样,文档是否采用可解析的格式,例如 XML 或结构良好的 HTML?在这种情况下,您可能能够从文档中生成代码,而不是通过代码进行反映。根据具体情况,这可能会更快。

    【讨论】:

    • 这正是我想要避免的:这个 api 的表面相当大。我可以将其限制为单个 SL 客户端,但这不会暴露整个 API 并且不能重用。正如您似乎建议的那样手动代理所有内容是太多的工作。我需要自动生成的帮助。 RIA Services:不确定,会检查的。但我上次检查时,它似乎以数据库为中心。
    • RIA 服务不是以数据库为中心的。您可以使用它公开任何 .NET 对象。但是,如果 API 太大而无法使用特定方法进行代理,它对您没有帮助。当外观不起作用时,我将编辑我的答案以提供一些建议。
    • 感谢您的跟进。是的,API 是基于 .Net 的。是的,我可以尝试生成类似的东西(这似乎是唯一的选择)。我想,再让这个开放一天,然后我会接受我的命运。
    • 是的,我不羡慕你的职位。祝你好运。
    【解决方案2】:

    好的,我这边的脑筋急转弯方案#1:

    1. 使用 Visual Studio 重构菜单在“ApiClientEntryPoint”上“提取接口”。
    2. 创建一个实现上述接口的新 WCF 服务,并让 VS 为您生成方法存根。
    3. 'For PropertyExposingAnInterface.SomeOtherMethodCall' 您将不得不扁平化接口,因为没有“嵌套”服务操作的概念。

    您唯一的其他选择是使用 T4 代码生成,这可能需要比上述想法更长的时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多