Zum Inhalt

Module

Ein Modul ist eine Klasse, die Dienste registriert und in Web-Hosts Endpunkte einhängt. Module erklären mit [DependsOn], was sie brauchen; Coworkee lädt den ganzen Graphen einmal, in Abhängigkeitsreihenfolge.

[DependsOn(typeof(CoworkeeODataModule), typeof(CoworkeeStorageModule))]
public sealed class MyAppDocumentsModule : CoworkeeModule, IWebModule
{
    public override void ConfigureServices(ModuleServiceContext context)
    {
        context.Services.AddMessagingFromAssembly(typeof(MyAppDocumentsModule).Assembly);
        context.Services.AddODataEntity<Document>("Documents", DocumentPermissions.Documents.View, d => d.BlobKey);
    }

    public void ConfigureApplication(WebApplication app) => app.MapDocumentEndpoints();
}
Member Wann es läuft
ConfigureServices(ModuleServiceContext) Während der Host seine Service-Collection aufbaut. context.Configuration ist die Host-Konfiguration.
IWebModule.ConfigureApplication(WebApplication) Nachdem die App gebaut ist, in Modulreihenfolge. Endpunkte einhängen, Middleware ergänzen.

Ein Root pro Host

Ein Host nennt genau ein Root-Modul, der Rest ergibt sich aus den Abhängigkeiten:

builder.AddCoworkee<MyAppApiModule>();   // registriert jedes Modul im Graphen
var app = builder.Build();
app.UseCoworkee();                       // Authentifizierung, Problem Details, dann jedes IWebModule

Hosts ohne HTTP, etwa der Migrations-Dienst, rufen stattdessen services.AddCoworkeeModules<TRoot>(configuration) auf.

Verschiedene Hosts setzen aus denselben Modulen verschiedene Graphen zusammen. Im Template hängt das API-Root von Katalog- und Dokumentenmodul ab, der Auth-Host nur von der Infrastruktur, CoworkeeAuthServerModule und mit Beispielen vom schlanken MyAppRegistrationDocumentsModule, das Registrierungsdokumente ohne die Dokumenten-API ablegt. Ein Modul, das nicht im Graphen eines Hosts liegt, kostet diesen Host nichts.

Contributor statt zentraler Listen

Module ändern nie eine zentrale Liste. Sie fügen Contributor hinzu, die das zuständige Paket einsammelt:

Contributor Paket Liefert
IModelContributor Infrastructure Entity-Mappings für den DbContext der App
IPermissionDefinitionContributor Application Berechtigungsgruppen und -namen
ISettingDefinitionContributor Settings Laufzeit-Einstellungen mit Gültigkeitsbereich und Typ
IMailTemplateContributor Mailing Mail-Vorlagen mit Standardtexten pro Sprache
INavigationContributor Client.Blazor Menüeinträge
IAppBarContributor Client.Blazor Komponenten in der App-Leiste

Deshalb lässt sich ein Modul hinzufügen oder entfernen, ohne anderswo etwas anzufassen.

Usings

Der meiste Code braucht wenige Namespaces:

using Coworkee.Core.Modularity;          // CoworkeeModule, DependsOn, ModuleServiceContext
using Coworkee.AspNetCore;               // IWebModule, AddCoworkee, UseCoworkee
using Coworkee.Application.Messaging;    // AddMessagingFromAssembly, IDispatcher, ICommand, IQuery, IHandler
using Coworkee.Core.Results;             // Result, Error

Pakete und Namespaces enthält die vollständige Liste.