Я пишу интеграцию REST API с Refit. У меня есть конечная точка под названием /items
.
У него четыре основных метода. (GetAsync, GetAllAsync, PostSingleAsync, PostMultpileAsync)
Однако вы можете углубиться в эту конечную точку, например /items/{itemId}/linkeditems, /items/{itemId}/infocodes
...
Эти дочерние конечные точки (linkeditems,infocodes
) имеют почти одинаковые методы
единственное отличие состоит в том, что все они требуют parentId
.
В данный момент я использую общий репозиторий, чтобы сохранить его СУХИМ.
Как я могу расширить конечную точку своих предметов, чтобы она поддерживала что-то вроде этого:
public interface IParentRefitApi<TModel> where TModel : BaseModel
{
[Get("/{id}")]
Task<TModel> GetAsync(string id);
[Get("")]
Task<IEnumerable<TModel>> GetAllAsync();
[Post("")]
Task<TModel> PostAsync([Body] TModel payload);
[Post("/multiple")]
Task<IEnumerable<TModel>> PostMultipleAsync([Body] IEnumerable<TModel> payload);
}
var itemsEndpoint = RestService.For<IParentRefitApi<Item>>("http://api.example.com/items");
var item = await itemsEndpoint.GetAsync();
//Access linked items like this:
var allLinkedItems = await itemsEndpoint.LinkedItems.GetAllAsync(item.Id);
Можно ли как-то обойти это, все еще используя дженерики? Как можно ограничить вызов дочерней конечной точки для модели, которая не поддерживает вложение?
Может быть, использовать что-то вроде дочерней конечной точки?
public interface IChildRefitApi<TChildModel> where TChildModel : BaseModel
{
[Get("/{parentId}/childUrl/{childId}")]
Task<TChildModel> GetAsync(string parentId, string childId);
[Get("/{parentId}/childUrl")]
Task<IEnumerable<TChildModel>> GetAllAsync(string parentId);
[Post("/{parentId}/childUrl")]
Task<TChildModel> PostAsync(string parentId, [Body] TChildModel payload);
[Post("{parentId}/childUrl/multiple")]
Task<IEnumerable<TChildModel>> PostMultipleAsync(string parentId, [Body] IEnumerable<TChildModel> payload);
}