Я на самом деле успешно использую общие запросы / ответы.
Хитрость заключалась в том, чтобы регистрировать закрытые общие запросы / ответы как известные типы.
Для этого я использую следующие соглашения:
- общие запросы / ответы могут иметь только один общий параметр
- этот универсальный параметр должен иметь общее ограничение, которое указывает, что он должен реализовывать данный интерфейс
Я использую это соглашение для создания всех возможных закрытых универсальных типов.
что я собираюсь использовать в качестве запроса или ответа.
Например, у меня может быть что-то вроде этого:
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-части приложения, и это
работает очень хорошо.