общие запросы на Агату - PullRequest
       23

общие запросы на Агату

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

кто-нибудь знает, почему я не могу этого сделать?

public class CreateScenarioHandler : 
GL.RRSL.RequestHandler<CommandRequest<ScenarioProfileData>,
                       CommandResponse<ScenarioProfileData>>

Почему Агата не может выяснить тип общего запроса.Это определено там.?

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

любые идеи о том, как это сделать.Это настолько ограничивает необходимость создавать объект запроса для каждого типа операции.

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Я на самом деле успешно использую общие запросы / ответы.

Хитрость заключалась в том, чтобы регистрировать закрытые общие запросы / ответы как известные типы. Для этого я использую следующие соглашения:

  • общие запросы / ответы могут иметь только один общий параметр
  • этот универсальный параметр должен иметь общее ограничение, которое указывает, что он должен реализовывать данный интерфейс

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

interface IDtoWithId 
{ 
 int Id { get; } 
} 

public class GetEntityRequest<TDto> : Request where TDto : IDtoWithId 
{ 
   .... 
} 
public class UserDto : IDtoWithId 
{ 
   public int Id { get; set; } 
   public string Name { get; set; } 
} 

Тогда при настройке Агаты я использую что-то вроде это https://gist.github.com/916352 и делает:

.... 
configuration.Initialize(); 
KnownTypeProvider.ClearAllKnownTypes(); 
KnownTypeHelper.RegisterRequestsAndResponses(typeof(UserDto).Assembly);

KnownTypeHelper регистрирует тип GetEntityRequest как известного типа, и это позволяет мне обрабатывать этот запрос с помощью обработчика иерархия такая:

public abstract class GetEntityHandler<TEntity, TDto> : 
RequestHandler<GetEntityRequest<TDto>, GetEntityResponse<TDto>> 
{ 
   ... 
} 

public class GetUserHandler : GetEntityHandler<User, UserDto> 
{ 
} 

Я использую этот подход для CRUD-части приложения, и это работает очень хорошо.

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

Проблема здесь связана с тем, как определяются CommandRequest и CommandResponse. Агата смотрит на классы, расширяющие запросы и ответы, и добавляет их к известным типам в WCF.

Когда сервер запускает службу, WCF жалуется, что тип CommandRequest является универсальным и не может использоваться. WCF, если говорит, что не может утверждать, что знает об универсальном типе.

Когда я определяю CommandRequest и CommandResponse как абстрактные, а затем создаю классы, такие как ScenarioIORequest / Response, которые расширяют CommandRequest и CommandResponse соответственно с типом apropiate для переноса, WCF не жалуется.

Мне кажется, что мне приходится тратить время на определение конкретных типов, когда мне нужны общие запросы и ответы для разных DTO. Возможно, это изменится в какой-то момент, но это скорее проблема WCF, чем проблемы проекта Agatha.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...