Erstellen einer ServiceBase-Klasse für Client-AppsC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Erstellen einer ServiceBase-Klasse für Client-Apps

Post by Anonymous »

Ich habe mehrere Client-Anwendungen, die meine Backend-API aufrufen, um Daten abzurufen, und dies führt zu einer Situation, in der ich doppelten Code in meinen Client-Apps habe. Ich versuche jetzt, eine ApiServiceBase-Klasse zu erstellen, in der ich den gesamten allgemeinen Code an einen Ort verschieben und von dort aus nutzen kann.
Ich habe Basisklassen für POCO-Objekte erstellt und verwendet und dachte, dass das Erstellen und Verwenden dieser Klassen in Diensten nicht so unterschiedlich sein sollte.
Ich habe meine Basisklasse erstellt und sie in ein NuGet-Paket umgewandelt. Die Basisklasse ist zu diesem Zeitpunkt recht einfach und sieht in etwa so aus:

Code: Select all

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
}
}
Ich installiere das NuGet-Paket in meinen Client-Apps, d. h. Blazor WASM und .NET MAUI. Dann erstelle ich in meinen einzelnen Client-Apps eine ApiService-Klasse, die von dieser Basisklasse erbt, etwa so:

Code: Select all

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;
}
}
In der Program.cs habe ich Folgendes für ApiService:

Code: Select all

...
builder.Services.AddSingleton();
...
Ich rufe dann einfach meine API-Methode in ApiService in meiner Client-App auf.
Im Beispiel hier zeige ich, wie ich es in meinem ViewModel mache für meine Homepage in meiner .NET MAUI-App:

Code: Select all

public partial class HomeViewModel : BaseViewModel
{
private readonly IApiService _myApi;

public HomeViewModel(IApiService myApi)
{
_myApi = myApi;
}

internal async Task InitAsync()
{
var data = await _myApi.GetSomeData();
}
}
Dies sollte die GetSomeData()-Methode im lokalen ApiService aufrufen, die die allgemeine GetAync()-Methode in ApiServiceBase verwenden sollte. Ebenso möchte ich in der Lage sein, die GetUserAccount()-Methode in ApiServiceBase direkt aus dem HomeViewModel aufzurufen.
Wenn ich meine Client-App ausführe, erhalte ich keine Fehlermeldungen, aber sie scheint einfach da zu bleiben und nichts zu tun. Es stürzt nicht ab und wirft keine Fehler aus, aber ich erreiche nie meine Haltepunkte, an denen ich die GetSomeData()-Methode in meinem ApiService aufrufe.
Ich habe zwei Fragen:
  • Was fehlt mir bisher, sodass meine Client-App einfach hängt, ohne abzustürzen?
  • Ich möchte auch eine Schnittstelle für ApiServiceBase erstellen. Bei meinen ersten Versuchen wurde mir immer wieder mitgeteilt, dass ApiService die in ApiServiceBase enthaltenen Methoden nicht implementiert. Es sagt mir zum Beispiel so etwas wie „ApiService implementiert die GetUserAccount()-Methode nicht, die sich in ApiServiceBase befindet und auch in der IApiServiceBase-Schnittstelle referenziert wird.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post