Wir haben euch bereits unsere Lösung für eine Digitale Unterschrift für SharePoint Dokumente vorgestellt. In diesem Beitrag möchten wir euch gerne näher erklären, wie wir unsere Applikation angepasst haben, um unsere Lösung für die Digitale Unterschrift auch im SharePoint Online verwenden zu können.

SharePoint Online Unterschrift: Workflow starten

Unterschrift im SharePoint Online - Erstellung eines „Core“-Projekts

Damit man unsere Lösung für die Digitale Unterschrift auch im SharePoint Online installieren kann, haben wir unser Projekt in mehrere Projekte aufgeteilt. Wir haben nun ein „Core“-Projekt, welches keine spezifischen SharePoint Funktionalitäten beinhaltet. In diesem Projekt bilden wir die Grundfunktionalität unserer Applikation nur mittels Interfaces ab. Im „Core“-Projekt arbeiten wir daher nur mit den Interfaces und nicht mit konkreten Implementierungen.

SharePoint Online Unterschrift: Core Project

Die Implementierungen dieser Interfaces haben wir in unterschiedliche Projekte ausgelagert. Wir haben unter anderem ein SSOM-Projekt (Server Side Object Model-Projekt) erstellt. Dieses kann man zum Beispiel in einer SharePoint 2019 Umgebung verwenden. Für SharePoint Online haben wir jetzt ein CSOM-Projekt (Client Side Object Model-Projekt) hinzugefügt. Natürlich kann man hier je nach Anforderungen noch weitere Projekte hinzufügen. Es wäre zum Beispiel auch möglich, die Daten nicht aus dem SharePoint zu beziehen, sondern aus einer Datenbank.

Dependency Injection mittels Ninject

Damit wir auf eine einfache Weise entscheiden können, welches Projekt wir für die Implementierung verwenden wollen, laden wir uns dieses mittels Dependency Injection. Dafür verwenden wir das Nuget-Paket „Ninject“. Ninject arbeitet mit sogenannten Modulen. Diese können in das Projekt geladen werden. In so einem Ninject-Modul kann man eine Klasse für ein bestimmtes Interface mit der Methode „Bind“ festlegen.

 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 dann beim Laden des Interfaces instanziert.

WorkflowRepository = kernel.Get<IWorkflowRepository>();

Wir haben dafür jetzt zwei Ninject-Module – eines für das SSOM-Projekt und eines für das CSOM-Projekt.

Wir haben ein Interface für einen Modul-Provider hinzugefügt. Dieser Provider gibt dann das richtige Ninject-Modul zurück, welches die korrekten Bindings für die Interfaces beinhaltet.

// Interface für den Module Provider
public interface IRepositoryModuleProvider
{
    NinjectModule GetRepositoryModule(string url);
}

// SSOM Implementierung des Module Providers
public NinjectModule GetRepositoryModule(string url)
{
    return new SsomRepositoryModule(url);
}

Eigene Projekte für unterschiedliche SharePoint Versionen

Die Funktionalität unseres „Core“-Projektes kann jetzt in den jeweiligen Projekten für unterschiedliche Versionen verwendet werden. Für SharePoint Online haben wir ein Provider Hosted Add-In erstellt. In der Page werden dann beim Instanzieren des PageInitializers die benötigten Modul-Provider angegeben. Der Modul-Provider liefert das korrekte Ninject-Modul zurück, welches die Bindings der Interfaces beinhaltet. Dadurch erhält man in der Applikation die korrekten Implementierungen für die Interfaces. Für SharePoint Online geben wir hier eben einen CSOMRepositoryModuleProvider an.

var contextUrl = HttpUtility.UrlDecode(Page.Request["SPHostUrl"]);

var pageInitializer = new PageInitializer<T, CsomRepositoryModuleProvider>(Page);
pageInitializer.Initialize(contextUrl);   // Im Initialize wird dann der Request verarbeitet und die weitere Funktionalität aufgerufen

Wir können hier also ganz einfach zwischen den verschiedenen Implementierungen wechseln. Dafür müssen wir nur eine einzige Code-Zeile anpassen. Möchten wir das SsomRepositoryModule verwenden, geben wir einfach den richtigen Typ beim Instanzieren des PageInitializers an. Dadurch erhalten wir automatisch die richtigen SSOM Implementierungen.

var pageInitializer = new PageInitializer<T, SsomRepositoryModuleProvider>(Page);

Haben wir euer Interesse geweckt und hättet ihr gerne nähere Informationen zu unserer Lösung für die Digitale Unterschrift für SharePoint Online? Dann nehmt gerne Kontakt mit uns auf.

Kontakt aufnehmen