Как поставить перехватчик или прокси на интерфейс OpenAPI?
Я работаю с веб-приложениями .Net Core 3.1 и .Net Framework 4.6.2, чтобы создать лучшую структуру для вызова служб RESTful, которым требуется инфраструктура для установки двух параметров.
Я почти уверен, что решение моего вопроса будет включать динамический прокси Castle Windsor или что-то очень похожее (возможно, Dora), но после прочтения всех документов я могу понять, как делать то, что я пытаюсь достичь.
Ситуация заключается в том, что у компании есть политика, согласно которой ВСЕ службы RESTful являются производными от базового класса, который имеет два значения: userId и appName. OpenAPI используется для генерации клиентского кода, поэтому ниже
public interface BaseRequest
{
[DataMember]
int UserId { get; set; }
[DataMember]
string AppName { get; set; }
}
public interface UpdateItemRequest : BaseRequest
{
[DataMember]
string Name {get;set;}
}
public interface ItemApi : IApiAccessor
{
GetItemResponse GetItem (string itemNumber = default(int), int? userId = default(int?), string appName = default(string));
UpdateItemResponse UpdateItem (UpdateItemRequest body = default(UpdateItemRequest));
}
Вызов API завершится ошибкой, если не заданы userId и AppName. Цель состоит в том, чтобы избавить разработчика от необходимости постоянно устанавливать эти значения и устанавливать их в классе перехватчика или прокси, я ищу что-то вроде этого:
public class ItemService: IApiAccessor
{
private ItemApi _itemApi;
public ItemService( ICustomInterceptorOrProxy<ItemApi> itemApi)
{
_itemApi = itemApi
}
public GetItemResponse GetItem(string itemNumber)
{
return _itemApi.GetItem(itemNumber);
}
public UpdateItemResponse UpdateItem(string itemNumber, string name)
{
return _itemApi.UpdateItem(new UpdateItemRequest {
ItemNumber = itemNumber,
Name = name}
);
}
}
И реализация ICustomInterceptorOrProxy заполнит userId и AppName. У меня есть следующие основные проблемы:
Как создать перехватчик / прокси, который будет работать с интерфейсом OpenAPI. Поскольку интерфейс автоматически создается OpenAPI, у меня нет возможности добавлять к нему атрибуты. Все они являются производными от общего интерфейса: IApiAccessor.
Существует также вопрос о введении значений в такие методы, как GetItem, где отправляются отдельные параметры, а не соответствующий объект GetItemRequest (который все еще присутствует, но цель состоит в том, чтобы максимально облегчить жизнь разработчика, используя его. Я на 99,9% уверен, что размышление об исходном методе может быть выполнено, чтобы обнаружить, что метод действительно нуждается в этих значениях, и для их добавления, но мне интересно, есть ли лучший способ, чем использование отражения каждый раз, он немного медленный.