Общий DataContract в Agatha WCF - PullRequest
       22

Общий DataContract в Agatha WCF

0 голосов
/ 04 апреля 2011

Я пытаюсь использовать класс Generic DataContract, чтобы мне не приходилось реализовывать несколько типов для коллекции различных объектов.

Exp:

У меня есть объект Profile, который содержит коллекцию объектов.

Итак, я хочу иметь один Profile<Foo> и Profile<Foo1>, где профиль содержит коллекцию объектов Foo или Foo1.

Я читал, что WCF не поддерживает универсальные классы, и на самом деле я получаю следующую ошибку.

Type 'GL.RequestResponse.ProfileResponse 1 [T] 'нельзя экспортировать как тип схемы, потому что это открытый универсальный тип.Вы можете экспортировать универсальный тип, только если все его универсальные типы параметров являются фактическими типами.

Теперь ProfileResponse - это объект Profile, который я пытаюсь использовать.

Теперь на моем хосте я делаю следующее.:

 ServiceConfig(typeof(ProfileHandler<EducationResponse>).Assembly, 
               typeof(ProfileRequest).Assembly,
               typeof(Container)).Initialize();

Это определение обработчика с помощью контракта данных.

   public class ProfileHandler<T> : RequestHandler<ProfileRequest,
                                                   ProfileResponse<T>> 

Контейнер использует Windsor Container для регистрации объектов.

Регистрация работает нормально, но после того, как я инстанцировал Service Host для процессора WCF и вызвал Open Method хоста, я получаю вышеуказанную ошибку.

Неужели я не могу написать общий ответ на wcf с agatha?Похоже на такую ​​трату времени определять класс контейнера Profile для каждого типа, содержащегося в этой коллекции.

спасибо.

1 Ответ

0 голосов
/ 09 апреля 2011

Нельзя иметь открытые универсальные обработчики, потому что стороне сервера нужно знать, что это за тип. Можно использовать так называемые закрытые родовые методы. Таким образом, серверная сторона знает типы для загрузки обработчика.

Кроме того, можно потенциально настроить Агату так, чтобы она позволяла получать дополнительную информацию, связанную с запросом. В этом случае это будет тип, включенный в ответ.

Это можно сделать, определив класс BaseRequest и попросив весь запрос расширить этот класс. Этот класс может иметь свойство, которое принимает тип ответа. Или тип, который будет включен в ответ.

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

Я не реализовал это, поскольку это заняло бы слишком много времени, и я не уверен, что хочу нести ответственность за поддержку Agatha для нашего приложения, но именно так я бы это и сделал.

...