Prefetching-Daten in mit Linq-to-SQL, IOC und Repository Muster
-
06-07-2019 - |
Frage
mit Linq-to-SQL würde Ich mag einige Daten vorab abzurufen.
1) die gemeinsame Lösung ist mit Dataload beschäftigen , aber in meiner Architektur wird es nicht funktionieren, weil:
- haben die Optionen vor der ersten Abfrage festgelegt werden
- Ich verwende IOC, so dass ich instanziieren nicht direkt auf den Datacontext (I-Code bei Instanciation nicht ausführen kann)
- meine Datacontext ist hartnäckig für die Dauer einer Web-Anfrage
2) Ich habe eine andere Möglichkeit gesehen, basierend auf loading Daten und ihr Childs in einem Verfahren, dann nur die Daten zurückkehren (so werden das Kind bereits geladen) < a href = "http://www.west-wind.com/weblog/posts/38838.aspx" rel = "nofollow noreferrer"> hier ein Beispiel
Dennoch in meiner Architektur, es kann nicht nicht:
- sind meine Anfragen aus meinem Repository kaskadiert und kann von vielen Dienstleistungen verbraucht werden, die Klauseln hinzufügen, werden
- Ich arbeite mit Schnittstellen, die konkreten Instanzen der Linq-to-SQL-Objekte haben die Repositories nicht verlassen (ja, können Sie mit Schnittstellen arbeiten und füge Klauseln)
- Meine Repositories sind generic
Ja, diese Architektur ist ruhig kompliziert, aber es ist sehr cool, wie ich mit dem Code wie lego spielen kann;)
Meine Frage ist: Was sind die andere Möglichkeiten ein Daten Prefetch
Lösung
In meiner app verwende ich vielleicht eine Variation an Ihre potentiellen Lösung # 2. Es ist etwas schwierig zu erklären, aber einfach: i Kette und verzögertes Laden in meinem Modell mit benutzerdefinierten verschieben faul Klassen weg, um abstrakten vom LinqToSql spezifischen unterschieden Ausführung, die ich mit IQueryable
Anspruch nehmen. Vorteile:
- My Domain Model und Service-Schicht nach oben nicht notwendigerweise auf dem LinqToSql Provider angewiesen sein (ich kann meine DAL mit Schnittstellen tauschen, wenn ich will)
- Mein Service Methoden können und das Rück tun komplette Objektdiagramme mit mehreren ‚Ankerpunkte‘ für verzögertes Laden Klassen, die abstrahieren eine bestimmte verzögertes Laden Umsetzung - so kann ich LinqToSql spezifische unterschieden Ausführung oder etwas anderes nutzen (zB Anon Delegierten. . wieder finden href="https://stackoverflow.com/questions/1669607/is-this-repository-pattern-efficient-with-linq-to-sql/1695561#answer-1695561"> diese Antwort auf )
- kann ich
IQueryable
Ergebnisse während meiner app (auch auf der Benutzeroberfläche, wenn ich will) halten somit unendlich LINQ-Abfrage Verkettungs ermöglicht, ohne sich um die Leistung zu sorgen.
Andere Tipps
Ich bin mir nicht bewusst, andere Möglichkeiten, es scheint, wie Sie LinqToSql an seine Grenzen (ich kann falsch sein, jedoch).
gedrückt habenIch denke, die besten Optionen an diesem Punkt sind:
- Fügen Sie einige „non-generic“ Methoden, um Ihre Anwendung zu behandeln nur die spezifische Szenarien, in denen Sie / brauchen eifrig Laden wollen und dies nicht tun Verwenden Sie Ihre „normal“, „generische“ Infrastruktur für diese Methoden.
- Verwenden Sie einen ORM, die anspruchsvollere Unterstützung für eifrigen und verzögertes Laden hat.
ich eine Lösung gefunden. Meine Antwort ist ' Dependency Injection '.
Es ist im Allgemeinen mit IOC ausgeliefert und können Sie einen Container Injektion von Klassen bei Instanciation verwalten IOC haben kann.
Alles was ich brauche ist ein CustomDCParameter Klasse zu injizieren, wenn ich eine DC instanziiert. Das Klasse enthält die Regeln, und der Konstruktor werden alle von ihnen gelten.