Obecnie używamy Entity Framework jako ORM w kilku aplikacjach internetowych i do tej pory nam to odpowiadało, ponieważ wszystkie nasze dane są przechowywane w jednej bazie danych. Używamy wzorca repozytorium i mamy usługi (warstwa domeny), które z nich korzystają, i zwracają jednostki EF bezpośrednio do kontrolerów ASP.NET MVC.
Jednak pojawił się wymóg korzystania z zewnętrznego interfejsu API (za pośrednictwem usługi internetowej), który zapewni nam dodatkowe informacje dotyczące użytkownika w naszej bazie danych. W naszej lokalnej bazie danych użytkowników będziemy przechowywać zewnętrzny identyfikator, który możemy podać API, aby uzyskać dodatkowe informacje. Dostępnych jest sporo informacji, ale dla uproszczenia jedna z nich dotyczy firmy użytkownika (imię i nazwisko, kierownik, pokój, stanowisko, lokalizacja itp.). Informacje te będą wykorzystywane w różnych miejscach w naszych aplikacjach internetowych, a nie w jednym miejscu.
Więc moje pytanie brzmi: gdzie jest najlepsze miejsce do wypełnienia tych informacji? Ponieważ jest używany w różnych miejscach, nie jest sensowne pobieranie go na zasadzie ad hoc, gdziekolwiek korzystamy z aplikacji internetowej - więc warto zwrócić te dodatkowe dane z warstwy domeny.
Początkowo myślałem o stworzeniu klasy modelu opakowania, która zawierałaby encję EF (EFUser) i nową klasę „ApiUser” zawierającą nowe informacje - a kiedy dostajemy użytkownika, otrzymujemy EFUser, a następnie otrzymujemy dodatkowe informacje z interfejsu API i wypełnij obiekt ApiUser. Jednak chociaż byłoby to dobre w przypadku pozyskiwania pojedynczych użytkowników, przewraca się, gdy uzyskuje się wielu użytkowników. Nie możemy trafić do interfejsu API podczas uzyskiwania listy użytkowników.
Moją drugą myślą było po prostu dodanie metody singleton do encji EFUser, która zwraca ApiUser, i po prostu zapełnienie jej w razie potrzeby. To rozwiązuje powyższy problem, ponieważ uzyskujemy do niego dostęp tylko wtedy, gdy jest to potrzebne.
Lub ostatnią myślą było zachowanie lokalnej kopii danych w naszej bazie danych i zsynchronizowanie jej z interfejsem API, gdy użytkownik się zaloguje. Jest to minimalna praca, ponieważ jest to tylko proces synchronizacji - i nie mamy narzutu związanego z uderzeniem DB i API za każdym razem, gdy chcemy uzyskać informacje o użytkowniku. Oznacza to jednak przechowywanie danych w dwóch miejscach, a także oznacza, że dane są nieaktualne dla każdego użytkownika, który nie logował się przez dłuższy czas.
Czy ktoś ma jakieś porady lub sugestie, jak najlepiej poradzić sobie z tego rodzaju scenariuszem?
it's not really sensible to fetch it on an ad-hoc basis
-- Dlaczego? Ze względu na wydajność?