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);
}
}