Używanie ustawień użytkownika przechowywanych w bazie danych - ASP.NET Core

0

W bazie danych przechowuję różne ustawienia użytkownika, m.in. format daty. Napisałem metodę rozszerzającą dla DateTimeOffset, w której to pobieram format daty z bazy i zwracam datę return date.ToString(dateFormat);. Problemem jest to, że metoda jest dosyć kosztowna, bo jeśli do wyświetlenia mam 100 dat to 100 razy muszę wysłać żądanie do bazy. Mógłbym pobrać raz z bazy ten format, powiedzmy w kontrolerze i potem przekazywać go dalej, ale nie do końca jestem przekonany, czy to dobry pomysł. Powiedzmy że w kontrolerze mam metodę A, która tworzy instancję klasy B, która to z kolei tworzy instancję klasy C, w której chcę konwertować datę do danego formatu. Wówczas do B trzeba przekazać format, a potem jeszcze do C i tak trzeba się bawić w przekazywanie dodatkowych argumentów i tak wszędzie gdzie chcemy wyświetlić datę, albo jakieś inne dane powiązane z ustawieniami użytkownika.

Klasa Startup

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddHttpContextAccessor();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    DateTimeOffsetExtension.HttpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();

    ...
}
public static class DateTimeOffsetExtension
{
    public static IHttpContextAccessor HttpContextAccessor { get; set; }

    public static string ToLocalDateString(this DateTimeOffset date)
    {
        int userId = Convert.ToInt32(HttpContextAccessor.HttpContext.User.FindFirst("Id").Value);
        string dateFormat = new DbContext().GetUserDateFormat(userId);

        return date.ToString(dateFormat);
    }
}
2

A nie możesz tego formatu daty trzymać w cache po zalogowaniu ?. Metoda konwertujaca nie powinna się łączyć do bazy.

0
szydlak napisał(a):

A nie możesz tego formatu daty trzymać w cache po zalogowaniu ?

W sumie to cache mógłby być rozwiązaniem. Tylko cache można by tworzyć w metodzie ToLocalDateString jeśli by nie istniał i ustawić czas życia np. na 1h. Po zalogowaniu to nie wiem, bo np. użytkownik mógłby zaznaczyć żeby go nie wylogowywało i nie wiadomo jaki czas życia ustawić.

Metoda konwertujaca nie powinna się łączyć do bazy.

Wówczas musiałbym za każdym razem, kiedy chcę wyświetlić datę pobrać format i przekazać go jako argument, a to dodatkowe linie kodu oraz powtarzalność kodu.

0
panDawid napisał(a):
szydlak napisał(a):

A nie możesz tego formatu daty trzymać w cache po zalogowaniu ?

W sumie to cache mógłby być rozwiązaniem. Tylko cache można by tworzyć w metodzie ToLocalDateString jeśli by nie istniał i ustawić czas życia np. na 1h. Po zalogowaniu to nie wiem, bo np. użytkownik mógłby zaznaczyć żeby go nie wylogowywało i nie wiadomo jaki czas życia ustawić.

Metoda konwertujaca nie powinna się łączyć do bazy.

Wówczas musiałbym za każdym razem, kiedy chcę wyświetlić datę pobrać format i przekazać go jako argument, a to dodatkowe linie kodu oraz powtarzalność kodu.

Nie wiem jaką masz strukturę projektu i co gdzie robisz. Ale jeśli np pobierasz dane z bazy (te daty do wyświetlenia) lub z innego miejsca to pobierasz z memory cache format a jeśl nie istnieje to z bazy. Przekazujesz do metody konwertującej ten format. Jeśli nie ustawisz jak długo ma być przechowywane to nie zostanie usunięte z cache chyba, że ramu braknie

1 użytkowników online, w tym zalogowanych: 0, gości: 1