2015-05-11 4 views
1

Я пытаюсь улучшить скорость задания C#, назовем его «WidgetProcessor». За один проход WidgetProcessor обработает около 5000 виджетов и займет около 12 часов (около 8 секунд/виджет).Ссылка на проект веб-службы C# непосредственно в решении C#

WidgetProcessor делает ссылки на 3 разных веб-службы и называет их несколько раз для каждого обработанного виджета. Существуют различные улучшения производительности/дизайна, которые могут быть внесены в программу «WidgetProcessor», но я хочу проверить, вызовы нескольких веб-сервисов по сети заставляют работу работать медленно.

У меня есть исходный код для каждой из трех веб-сервисов (и у вас есть доступ ко всем ресурсам, которые используют эти веб-службы) и Мне интересно, есть ли способ легко использовать интерфейсы веб-сервисов в WidgetProcessor, ссылаясь на сами проекты веб-сервисов (вместо вызова веб-службы по сети). Веб-службы реализованы на C#.

Я бы обращался непосредственно к классам реализации службы, но основная проблема, с которой я сталкиваюсь, заключается в том, что в веб-службах собрано около 100 контрактов данных, а имена, обращенные к публике, отличаются от классов реализации.

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

Таким образом, ссылки на реализации непосредственно означают, что я буду делать много изменений кода в WidgetProcessor. Скорее, я хотел бы использовать служебные интерфейсы, так что изменения кода могут оставаться как минимум.

В принципе, я хочу получить сервис в своем решении WidgetProcessor, который выглядит и действует как веб-сервис, но не выполняет его операций по сети.

Возможно ли это?

ответ

1

Вы можете добавить классы адаптеров, которые подкласс реализации с именем, указанным в DataContract:

public class WidgetInfo : WidgetDataContract { } 

Если вы обнаружили накладные вызова службы, чтобы быть слишком дорогим, вы можете увидеть выгоду собирается другой формат привязки или сериализации. WCF может приближаться к скорости процесса при правильной настройке.


Edit: Если вы намерены не модифицировать любой код, у вас есть пара вариантов, но я думаю, что они являются решением в поисках проблемы:

  • Mono.Cecil или Roslyn к автоматически сопоставлять между классами pre- или post-build
  • Только для типов вы можете использовать TypeForwardedToAttribute, но доступ к свойствам проблематичен. Это может зависеть от размещения генерируемых классов svcutil в другой сборке.
  • Использование Castle для создания динамических прокси-серверов и доступа к карте на основе от атрибутов
+0

Это решение работает, но требует много классов-оболочек. Некоторые члены данных внутри контрактов данных также переименованы, поэтому для данных также потребуется обертка. – SuperSimple

+0

@SuperSimple, это опции. Я добавил еще пару, но какую производительность вы ищете от службы? > 10k calls/second легко достижимо с WCF. – Mitch

Смежные вопросы