从现有API自动生成服务器端WCF服务

dee*_*ee1 13 c# wcf web-services

如何在不使用WCF项目的情况下,通过WCF将每个方法的API暴露给由多个类组成的API.

例如,假设我有以下内容

public interface RainfallMonitor
{
    [ExposeToWeb]
    void RecordRainfall(string county, float rainfallInches);

    [ExposeToWeb]
    float GetTotalRainfall(string county);

    void ClearRainfall(string county);
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以像往常一样创建一个WCF服务库,只需添加一个名为"RainfallMonitor"的WCF服务.

我正在探索的是......是否可能/合理地在编译时为整个API生成所有WCF相关代码而不实际生成类WCF服务.可能使用诸如ExposeToWeb表示通过服务公开哪些方法的属性.结果将像这样:

  1. 在项目中创建/修改类 RainfallAPI
  2. 编译并生成另一个RainfallService自动调用的项目/ dll .

实质上:

  • 如果可行,我可以采取什么方法来实际实施呢?
  • 我可能遇到什么严重的陷阱?
  • 是否有任何现有的代码库可以做类似的事情我可以寻找灵感

为了澄清:我不是在问自动生成客户端存根,我问的是在服务器端创建服务.

Mar*_*eke 0

对于您关于“我正在探索的是......是否可能/合理地在编译时为整个 API 生成所有 WCF 相关代码而不实际创建 WCF 服务类。”的问题,有一些选项,但是他们都需要做很多工作。

您需要编写一个代码生成应用程序/库,它利用CSharpCodeProvider等类(也有一个用于 VB 的类)和反射来检查您的库作为构建后步骤,在内存中构建您想要的代码,然后保存它作为 DLL 关闭。

此应用程序需要找到您创建的自定义属性,该属性指示它应该是 WCF 服务,并根据您定义的规则输出 WCF 代码。

实际上,您需要使用CodeDOM模型编写代码,这需要以完全不同的方式思考代码。并不是每个人都能将自己的思维抽象到那个水平。

请记住,利用 CodeDOM 模型,您可以克服 nodots 提到的一些问题,例如数据契约需要可序列化。可以添加它,并由基于 CodeDOM 的反射库输出一个新的 DLL。

通过深思熟虑的设计和大量的工作,就有可能实现您正在寻求的输出。这只是一条黑暗的道路,充满了陷阱。