直接在C#解决方案

时间:2015-05-11 16:15:38

标签: c# web-services wcf

我正在努力提高C#作业的速度,让我们称它为WidgetProcessor'。在一次运行中,WidgetProcessor将处理大约5,000个小部件并花费大约12个小时来完成(大约8秒/小部件)。

WidgetProcessor对3个不同的Web服务进行引用,并为每个处理的窗口小部件多次调用它们。可以对“WidgetProcessor”进行各种性能/设计改进。程序,但我想测试通过网络进行的多个Web服务调用是否导致作业运行缓慢。

我有三个Web服务中的每一个的源代码(并且可以访问这些Web服务使用的所有资源),并且我想知道是否有方法可以轻松使用Web WidgetProcessor中的服务接口通过引用Web服务项目本身(而不是通过网络调用Web服务)。 Web服务在C#中实现。

我会直接引用服务实现类,但我遇到的主要问题是Web服务总共有大约100个数据契约,面向公众的名称与实现类不同。

[DataContract(Name = "WidgetInfo")]
public class WidgetDataContract
{
      // DataMembers
}

因此,直接引用实现意味着我在WidgetProcessor中进行了许多代码更改。相反,我想使用服务接口,以便代码更改可以保持在最低限度。

基本上,我希望我的WidgetProcessor解决方案中的服务外观和行为类似于网络服务,但不会通过网络执行其操作。

这甚至可能吗?

1 个答案:

答案 0 :(得分:1)

您可以添加使用datacontract中指定的名称对实现进行子类化的适配器类:

public class WidgetInfo : WidgetDataContract { }

如果您发现服务调用的开销过于昂贵,您可能会看到使用不同绑定或序列化格式的好处。正确调整后,WCF可以接近进程速度。

编辑:如果您打算不修改任何代码,您确实有几个选项,但我认为它们是搜索问题的解决方案:

  • Mono.CecilRoslyn自动在构建前或构建后的类之间进行映射
  • 仅针对类型,您可以使用TypeForwardedToAttribute,但属性访问存在问题。这可能取决于将svcutil生成的类放在另一个程序集中。
  • 使用Castle构建动态代理和基于属性的地图访问