Создание класса ServiceBase для клиентских приложенийC#

Место общения программистов C#
Ответить
Anonymous
 Создание класса ServiceBase для клиентских приложений

Сообщение Anonymous »

У меня есть несколько клиентских приложений, которые вызывают мой серверный API для получения данных, и это создает ситуацию, когда у меня есть дублирующийся код в моих клиентских приложениях. Сейчас я пытаюсь создать класс ApiServiceBase, в котором я могу переместить весь общий код в одно место и использовать его оттуда.
Я создал и использовал базовые классы для объектов POCO и подумал, что создание и использование их в службах не должно сильно отличаться.
Я создал свой базовый класс и превратил его в пакет NuGet. Базовый класс на данный момент довольно прост и выглядит примерно так:

Код: Выделить всё

public class ApiServiceBase
{
IHttpClientFactory _httpFactory;
public ApiServiceBase(IConfiguration config, IHttpClientFactory httpFactory)
{
// Read settings from config and inject HttpClientFactory
_httpFactory = httpFactory;
}

public async Task GetUserAccount()
{
// Simple API call that returns User account for current user
}

public async Task GetAsync(string url)
{
// Code that handles read operation logic
}

public async Task PostAsync(string url, TRequest data)
{
// Code that handles write operation logic
}
}
Я устанавливаю пакет NuGet в свои клиентские приложения, например Blazor WASM и .NET MAUI. Затем в своих отдельных клиентских приложениях я создаю класс ApiService, который реализует этот базовый класс следующим образом:

Код: Выделить всё

public class ApiService : ApiServiceBase, IApiService
{
public ApiService(IConfiguration config, IHttpClientFactory httpFactory) : base(config, httpFactory)
{
}

public async Task GetSomeData()
{
var data = await GetAsync("/myendpoint"); // This GetAsync() method is in ApiServiceBase
return data;
}
}
В Program.cs у меня есть следующее для ApiService:

Код: Выделить всё

...
builder.Services.AddSingleton();
...
Затем я просто вызываю свой метод API в ApiService в своем клиентском приложении. В приведенном ниже примере я показываю, как это сделать в моей ViewModel для моей домашней страницы в моем приложении .NET MAUI:

Код: Выделить всё

public partial class HomeViewModel : BaseViewModel
{
private readonly IApiService _myApi;
public HomeViewModel(IApiService myApi)
{
_myApi = myApi;
}

internal async Task InitAsync()
{
var data = await _myApi.GetSomeData();
}
}
Это должно вызвать метод GetSomeData() в локальном ApiService, который должен использовать метод общего назначения GetAync() в ApiServiceBase. Точно так же я хочу иметь возможность вызывать метод GetUserAccount() в ApiServiceBase непосредственно из HomeViewModel.
Когда я запускаю свое клиентское приложение, я не получаю никаких ошибок, но кажется, что оно просто сидит и ничего не делает. Он не вызывает сбоев и ошибок, но я никогда не достигаю точек останова, когда я вызываю метод GetSomeData() в своем ApiService.
У меня есть два вопроса:
  • Чего мне не хватает, чтобы мое клиентское приложение просто зависало без сбоев?
  • Я также хочу создать интерфейс для ApiServiceBase. В моих первоначальных попытках он постоянно сообщал мне, что ApiService не реализует методы, находящиеся в ApiServiceBase. Например, он сообщает мне, что что-то вроде ApiService не реализует метод GetUserAccount(), который находится в ApiServiceBase и на который также ссылаются в интерфейсе IApiServiceBase.


Подробнее здесь: https://stackoverflow.com/questions/798 ... lient-apps
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»