combit.Reporting.Repository Namespace
Wenn Berichte in verteilten Anwendungen wie z.B. Web-Anwendungen verwendet werden sollen, müssen alle benötigten Dateien zwischen den beteiligten Systemen bzw. zwischen Client und Server ausgetauscht und auf demselben Stand gehalten werden. Es bietet sich daher an, die Projektdateien in einer zentralen Datenbank zu speichern, was jedoch spätestens dann komplex wird, wenn ein Projekt Grafiken, Drilldown-Projekte oder weitere externe Dateien über lokale Dateipfade referenziert, die auf einem anderen System ebenfalls gültig sein müssen.
Mit dem Repository-Modus kann ganz auf die Verwendung von lokalen Dateien im Projekt verzichtet werden, sodass die List & Label-Projekte sowie alle davon benötigten Dateien mit wenig Aufwand an einer zentralen Stelle (dem sog. Repository) verwaltet werden können – beispielweise in einer Datenbank oder von einem Webservice.
Grundlagen
Im Repository-Modus speichert und lädt List & Label die in einem Bericht verwendeten Dateien nicht selbst. Anstelle von Dateipfaden- und namen werden eindeutige Repository-IDs verwendet. Sie müssen selbst die IRepository Schnittstelle implementieren und an das List & Label-Objekt übergeben. Ab diesem Zeitpunkt fragt List & Label Ihr benutzerdefiniertes Repository nach dem Dateiinhalt zu einer Repository-ID, oder übergibt dem Repository eine solche ID samt dem zugehörigen Dateiinhalt zum Speichern. Ob die Dateien im Repository von einer SQL-Datenbank, einem Webservice oder einer anderen Speicherlösung verwaltet werden, hängt ausschließlich von Ihrer IRepository-Implementierung ab. Das Laden und Speichern der Einträge im Repository geschieht dabei ausschließlich über Streams.
Die folgende Abbildung zeigt schematisch das Laden eines Berichts mit der ID "123" über eine IRepository-Implementierung, die intern eine SQL-Datenbank verwaltet:

Umsetzung
Allen Funktionen, denen bisher der Dateipfad des Projekts übergeben wurde (bspw. "C:\Reports\Invoice.lst"), wird stattdessen nun die Repository-ID (bspw. "repository://{53F875F0-6177-8AD5-01B44E3A9867}") übergeben.
Aus "Dateien" werden im Repository-Modus "Repository-Items" (Elemente) und aus den Dateinamen werden "Repository-IDs". Jedes Repository-Item (Element) besitzt neben der ID einen Typ, einen Zeitstempel und einen Bezeichner (String mit variabler Länge, der interne Informationen enthält). Ihre Repository-Implementierung muss neben dem Dateiinhalt also mindestens diese vier Informationen für jedes Repository-Item (Element) speichern und abrufen können.
Hier finden Sie eine Anleitung zur genauen Vorgehensweise, um das Repository zu verwenden:
Verwenden des Repository-Modes
Sie finden eine vollständige einfache Repository-Implementierung in den ASP.NET-Beispielprojekten (Klasse SQLiteFileRepository), die ein Repository mit einer SQLite-Datenbank als Datenspeicher bereitstellt.
Tipps
- Nutzen Sie die Klasse RepositoryImportUtil, um bestehende lokale Dateien zu importieren bzw. neue Projekte im Repository zu erstellen.
- Mit der RepositoryItemDescriptor-Klasse können Sie den Anzeigenamen ändern, der in den Auswahldialogen im Designer anstelle der internen Repository-ID angezeigt wird.
- Zugriffe auf das Repository erfolgen sequentiell. Nutzen Sie aber das gleiche Repository-Objekt für mehrere List & Label Instanzen oder ist der verwendete Datenspeicher nicht threadsicher, ist eine Synchronisierung notwendig.
- Web-Anwendungen: Um auch größere Dateien in das Repository einfügen zu können, sollten die beiden Parameter maxRequestLength und executionTimeout in der web.config auf ausreichend große Werte gesetzt werden. Dies wird auch in den mitgelieferten ASP.NET Beispiele gezeigt.