Wir haben euch bereits unsere Lösung für eine digitale Unterschrift für SharePoint-Dokumente vorgestellt. In diesem Beitrag erklären wir, wie wir unsere Applikation so angepasst haben, dass die digitale Unterschrift auch in SharePoint Online eingesetzt werden kann.

Unterschrift in SharePoint Online – Aufbau eines Core-Projekts
Damit unsere Lösung für die digitale Unterschrift auch in SharePoint Online installiert werden kann, haben wir das Gesamtprojekt in mehrere Teilprojekte aufgeteilt. Es gibt nun ein Core-Projekt, das keine spezifischen SharePoint-Funktionalitäten enthält. In diesem Projekt bilden wir die Grundfunktionalität ausschließlich über Interfaces ab. Im Core-Projekt arbeiten wir daher nur mit Interfaces und nicht mit konkreten Implementierungen.

Die Implementierungen dieser Interfaces haben wir in separate Projekte ausgelagert. Unter anderem gibt es ein SSOM-Projekt (Server-Side Object Model), das sich z. B. in einer SharePoint-2019-Umgebung einsetzen lässt. Für SharePoint Online haben wir ein CSOM-Projekt (Client-Side Object Model) ergänzt. Je nach Anforderungen können weitere Projekte hinzukommen – etwa eine Variante, die Daten nicht aus SharePoint, sondern aus einer Datenbank bezieht.
Dependency Injection mit Ninject
Damit wir einfach steuern können, welche Implementierung verwendet wird, setzen wir auf Dependency Injection. Dafür nutzen wir das NuGet-Paket Ninject. Ninject arbeitet mit Modulen, die ins Projekt geladen werden. In einem Ninject-Modul wird eine Klasse für ein bestimmtes Interface mit der Methode Bind zugeordnet.
Beispiel: SSOM-Repository-Modul
public class SsomRepositoryModule : NinjectModule
{
private readonly string _url;
public SsomRepositoryModule(string url)
{
_url = url;
}
public override void Load()
{
Bind<IWorkflowRepository>()
.To<SsomWorkflowRepository>()
.WithConstructorArgument("url", _url);
}
}
Diese Klasse wird beim Laden des Interfaces instanziert:
WorkflowRepository = kernel.Get<IWorkflowRepository>();
Wir verwenden zwei Ninject-Module – eines für das SSOM-Projekt und eines für das CSOM-Projekt.
Zusätzlich haben wir ein Interface für einen Modul-Provider hinzugefügt. Dieser Provider gibt das passende Ninject-Modul mit den korrekten Bindings für die Interfaces zurück.
// Interface für den Modul-Provider
public interface IRepositoryModuleProvider
{
NinjectModule GetRepositoryModule(string url);
}
// SSOM-Implementierung des Modul-Providers
public NinjectModule GetRepositoryModule(string url)
{
return new SsomRepositoryModule(url);
}
Eigene Projekte für unterschiedliche SharePoint-Versionen
Die Funktionalität unseres Core-Projekts kann nun in projektspezifischen Varianten für unterschiedliche Versionen genutzt werden. Für SharePoint Online haben wir ein Provider-Hosted Add-in erstellt. In der Page werden beim Instanziieren des PageInitializer die benötigten Modul-Provider angegeben. Der Modul-Provider liefert das korrekte Ninject-Modul mit den Bindings der Interfaces. So erhält die Applikation automatisch die passenden Implementierungen. Für SharePoint Online verwenden wir dafür den CsomRepositoryModuleProvider.
var contextUrl = HttpUtility.UrlDecode(Page.Request["SPHostUrl"]);
var pageInitializer = new PageInitializer<T, CsomRepositoryModuleProvider>(Page);
// Im Initialize wird der Request verarbeitet und die weitere Funktionalität aufgerufen
pageInitializer.Initialize(contextUrl);
Zwischen den Implementierungen kann sehr einfach gewechselt werden – es genügt, eine einzige Codezeile anzupassen. Möchten wir das SsomRepositoryModule verwenden, geben wir den entsprechenden Typ beim Instanziieren des PageInitializer an. Dadurch erhalten wir automatisch die richtigen SSOM-Implementierungen.
var pageInitializer = new PageInitializer<T, SsomRepositoryModuleProvider>(Page);
Haben wir euer Interesse geweckt und möchtet ihr nähere Informationen zu unserer Lösung für digitale Unterschriften in SharePoint Online? Nehmt gerne Kontakt mit uns auf.