Общие ФОС проверкой ответов для нескольких служб


Справочная информация

Я строю веб-приложение, которое потребляет 3 разных служб WCF, размещенных внутри.

Каждый объект ответа от службы наследует от базового класса ResponseBase. Этот класс содержит свойства типа int код ошибки и строку сообщение об ошибке.

Когда я потреблял эти услуги в моем веб-приложения я хочу, чтобы реализовать некоторые общие ошибки обработки, которая проверяет, является ли объект ответа содержит код ошибки < 0.

Что я придумал-это статический класс ServiceHelper с несколькими перегрузками следующий метод:

public static void VerifyResponse(dynamic response)
{
    if (response == null) throw new ArgumentNullException("response");

    if (response.ErrorCode < 0)
        throw new InvalidServiceResponseException(response.ErrorCode, response.ErrorMessage);
}

Теперь вы можете узнать тип параметра является динамическим. Причина для этого, и это в основном, почему я задаю этот вопрос, заключается в том, что у меня нет объекта общей базы для определения всех объектов ответа. Потому что каждая служба WCF будет создать свои договоры не может быть общий объект базы между службами. Ну... это может быть сделано , но мы предпочитаем, чтобы держать его простым.

Вопрос

Вы какой-то магии способ проверить 3 разных типов объектов, но с правильно типизированный параметр и без создания различных метода для каждой службы. Потому что у каждой службы есть разные ResponseBase типа, хотя это на самом деле то же самое.

Или вы думаете, что это разрешено использовать динамический параметр в данном контексте?



959
2
задан 1 июня 2011 в 08:06 Источник Поделиться
Комментарии
1 ответ

Питер - пару замечаний:


  1. Поскольку вы говорите, что "каждый объект ответа от службы наследует от базового класса ResponseBase" инстинктивной реакцией является просто использовать ResponseBase и пусть модель наследования в C# обрабатывать все. Как вы идете, чтобы объяснить, однако, ResponseBase на самом деле не один базовый класс для служб, поскольку они отличаются от сервиса к сервису с сгенерированный код. В этом случае, вы точно знаете, какой формы предмет, но не знать ее тип. Это пример 'утиной типизацией' - если оно выглядит как утка, ходит как утка, и крякает как утка, то мы можем рассматривать его как утка. Это именно то, что динамическая типизация-это хорошо и мне кажется удобное использование этой функции из C# 4.0.

  2. Два условия исключений в коде не созданы равными. Первый, кажется, флаг неправильное использование метода, тогда как второй метод делает свою работу. Так рассмотреть вопрос о замене первого с контрактом кода, если вы находитесь на .Сеть 4. (См. Дино Эспозито статьи в MSDN журнала - 3 месяца подряд - для хорошего обзора, начало здесь. Обратите внимание на то, что контракты кода можно отключить для выполнения, и они могут быть уже в вашем проекте. Статьи смотрите Дино для объяснения.)

Вот псевдокод:

public static void VerifyResponse(dynamic response) 
{
Contract.Requires(response != null);
// or perhaps: Contract.Requires<ArgumentNullException>(response != null, "response");
// or: if (response == null) throw new ArgumentNullException("response");

if (response.ErrorCode < 0)
throw new InvalidServiceResponseException(response.ErrorCode, response.ErrorMessage);
}

2
ответ дан 13 января 2012 в 02:01 Источник Поделиться