Derzeit verwenden wir Entity Framework als ORM für einige Webanwendungen. Bis jetzt hat es uns gut gepasst, da alle unsere Daten in einer einzigen Datenbank gespeichert sind. Wir verwenden das Repository-Muster und verfügen über Dienste (die Domänenschicht), die diese verwenden, und geben die EF-Entitäten direkt an die ASP.NET MVC-Controller zurück.
Es besteht jedoch die Anforderung, eine Drittanbieter-API (über einen Webdienst) zu verwenden, die uns zusätzliche Informationen liefert, die sich auf den Benutzer in unserer Datenbank beziehen. In unserer lokalen Benutzerdatenbank speichern wir eine externe ID, die wir der to-API zur Verfügung stellen können, um zusätzliche Informationen zu erhalten. Es sind eine ganze Reihe von Informationen verfügbar, aber der Einfachheit halber bezieht sich eine davon auf das Unternehmen des Benutzers (Name, Manager, Raum, Berufsbezeichnung, Standort usw.). Diese Informationen werden an verschiedenen Stellen in unseren Web-Apps verwendet - im Gegensatz zur Verwendung an einem einzigen Ort.
Meine Frage ist also, wo ist der beste Ort, um diese Informationen zu füllen und darauf zuzugreifen? Da es an verschiedenen Orten verwendet wird, ist es nicht wirklich sinnvoll, es auf Ad-hoc-Basis abzurufen, wo immer wir es in der Webanwendung verwenden. Daher ist es sinnvoll, diese zusätzlichen Daten von der Domänenschicht zurückzugeben.
Mein erster Gedanke war nur, eine Wrapper-Modellklasse zu erstellen, die die EF-Entität (EFUser) und eine neue 'ApiUser'-Klasse mit den neuen Informationen enthält - und wenn wir einen Benutzer erhalten, erhalten wir den EFUser und dann den zusätzlichen Informationen aus der API und füllen Sie das ApiUser-Objekt. Dies ist zwar in Ordnung, um einzelne Benutzer zu erhalten, fällt jedoch um, wenn mehrere Benutzer abgerufen werden. Wir können die API nicht aufrufen, wenn wir eine Liste von Benutzern erhalten.
Mein zweiter Gedanke war nur, der EFUser-Entität, die den ApiUser zurückgibt, eine Singleton-Methode hinzuzufügen und sie bei Bedarf einfach zu füllen. Dies löst das oben genannte Problem, da wir nur dann darauf zugreifen, wenn wir es benötigen.
Oder der letzte Gedanke war, eine lokale Kopie der Daten in unserer Datenbank zu behalten und sie mit der API zu synchronisieren, wenn sich der Benutzer anmeldet. Dies ist nur ein minimaler Aufwand, da es sich nur um einen Synchronisierungsprozess handelt - und wir haben nicht den Aufwand, sie zu treffen die DB und API jedes Mal, wenn wir Benutzerinformationen erhalten möchten. Dies bedeutet jedoch, dass die Daten an zwei Orten gespeichert werden und dass die Daten für jeden Benutzer, der sich eine Weile nicht angemeldet hat, veraltet sind.
Hat jemand Ratschläge oder Vorschläge, wie man mit solchen Szenarien am besten umgeht?
it's not really sensible to fetch it on an ad-hoc basis
-- Warum? Aus Leistungsgründen?