Skip to content

Architecture - vue d'ensemble

Principe general

Une instance Umbraco 13 unique (src/Umbraco/) heberge le framework maison Nanoxi CMS v4.x (src/Nanoxi/Nanoxi.Cms.Base/), decoupe en ~23 sous-projets App.*. Le projet hote ne contient quasiment pas de logique metier : il compose le framework (DI, notification handlers, bundles WebOptimizer, middleware, routes custom) dans Program.cs et recoit au build les vues/assets copies depuis Nanoxi.

C'est une variante standalone chezzen : un seul site (racine /chezzen, document type domain), un seul skin default, build/deploiement par image Docker Linux. Pas de Vite, pas d'IIS.

Couches : Controllers -> Services -> Repositories -> Data, le tout greffe sur le contenu Umbraco (IPublishedContent + modeles ModelsBuilder).

Inventaire des sous-projets App.*

ProjetResponsabilite
App.CoreControllers (RenderController, SurfaceController), vues Razor, ViewComponents (widgets), scripts, middleware, helpers
App.ApiAPI REST (UmbracoApiController) : DashboardIntro (version dashboard), Event, Install (structure/uSync), Media, Test
App.DomainServices metier (DomainService) : resolution du Domain courant, skin, proprietes de site
App.DataModeles de donnees + SearchService (Examine)
App.RepositoryRepositories NPoco (ContactFormRepository) + mappings
App.InterfaceContrats DI organises par dossier : Domain, Email, Google, I18n, IO, Media, Navigation, Recaptcha, ...
App.ModelView models (ViewModel/Component/, ViewModel/Page/, ViewModel/Base/)
App.ConfigurationClasses d'options IOptions<T> (SmtpOptions, Recaptchav3Options, NewsletterOptions, Infomaniak, ...)
App.CacheSitemapCacheService et caches runtime
App.I18nI18nService : lookup dictionnaire, resolution culture (fr-CH, de-CH, en-GB)
App.MailEmailService : SMTP + rendu de templates Razor via IViewRender
App.NavigationNavigationService : menus / fil d'ariane depuis l'arbre de contenu
App.ValidationValidators FluentValidation (contact form, newsletter)
App.UmbracoFormsIntegration Umbraco Forms, SiteComposer (IComposer), workflow custom d'envoi de mail, theming
App.UtilHelpers : ViewRender (IViewRender), utilitaires string / reseau
App.NotificationHandlers de notifications Umbraco (ContentPublishing/Published, invalidation registre media)
App.NetworkSecurite reseau : NetworkSecurityService, NetworkConditionsService
App.TierOperations niveau multi-tenant / domaine
App.LibraryServices partages / providers
App.DefinitionConstantes / definitions (AppDefs_*.cs) : cles de dictionnaire, alias
App.PublishedModelsModeles ModelsBuilder generes (SourceCodeAuto) - NE PAS editer
App.BackofficePersonnalisation backoffice (2FA / provider TwoFactor)
App.MvcControllers / tag helpers

Flux de requete (rendu de page)

  1. Entree : src/Umbraco/Program.cs configure le routing Umbraco + routes custom (ex. Sitemap, mappees apres MapUmbracoRoute).
  2. Controller : un RenderController gere le contenu par document type. Existants : PageController, PostController, FeedController, EventController, EventsController, SitemapController (App.Core/Controllers/Umbraco/).
  3. Modele : CurrentPage (IPublishedContent) enveloppe par un modele ModelsBuilder. Le controller construit un view model composite et rend la vue ~/Views/<Type>.cshtml.
  4. Services : injectes par constructeur (DomainService, NavigationService, I18nService, Cache, ...).
  5. Widgets : la vue rend des ViewComponent (un par widget) via le BlockGrid de la page.
  6. POST de formulaire : gere par un SurfaceController (WidgetContactFormController, WidgetNewsletterController) : valide (FluentValidation + reCAPTCHA v3) -> envoie le mail (IEmailService) -> log en base (IContactFormRepository).

Composition & DI

Point central : src/Umbraco/Program.cs.

csharp
builder.CreateUmbracoBuilder()
    .AddBackOffice().AddWebsite().AddDeliveryApi()
    .AddComposers()
    .AddNotificationHandler<MediaSavedNotification, LiveMediaRegistryInvalidationHandler>()  // + Moved/Deleted/...
    .SetContentLastChanceFinder<FourZeroFourContentFinder>()
    .AddNotificationHandler<ContentPublishingNotification, ContentPublishingEvent>()
    .AddNotificationHandler<ContentPublishedNotification, ContentPublished>()
    .Build();
  • Services Nanoxi enregistres en Scoped : Ii18nService, IDomainService, IEmailService, IContactFormRepository, IReCaptchav3Service, INavigationService, INewsletterOptInService (impl. NewsletterOptInOptInService), ISitemapCacheService, IGooglePlacesService, INetworkSecurityService, INetworkConditionsService, IViewRender.
  • Validators FluentValidation enregistres en Transient (IValidator<WidgetNewsletterViewModel>, contact form, ...).
  • Options bindees via services.Configure<T>(config.GetSection("Nanoxi:CMS:...")) (SmtpOptions, Recaptchav3Options, NewsletterOptions).
  • Bundles WebOptimizer declares dans Program.cs : pour chaque skin, des AddCssBundle(...) (bundle-default-head, head-component, footer-component, blockgrid, feed, post, form, widget*, ...) et AddJavaScriptBundle(...) (bundle-calendarEvents, ...). C'est WebOptimizer qui assemble et minifie a la volee, pas un bundler frontend.
  • Middleware : garde 404 sur /media pour les medias supprimes/corbeille (LiveMediaRegistryInvalidationHandler + middleware), pose AVANT app.UseUmbraco().

Acces aux donnees (NPoco)

Pour les tables custom (nanoxi_*), pattern repository sur IScopeProvider :

csharp
using (var scope = _scopeProvider.CreateScope())
{
    scope.Database.Insert(record);   // ou db.Query<T>(sql, params)
    scope.Complete();
}

Mappings via attributs NPoco : [TableName("nanoxi_...")], [PrimaryKey("Id")]. Le contenu editorial passe lui par l'API Umbraco (IPublishedContent / ModelsBuilder), pas par NPoco.

Preoccupations transverses

  • Cache : SitemapCacheService et caches runtime Umbraco (AppCaches).
  • Recherche : SearchService sur Examine (Lucene).
  • i18n : I18nService sur ILocalizationService.
  • Securite : NetworkSecurityService, garde sur l'acces aux medias supprimes.

Fichiers cles

SujetFichier
DI / composition / bundlessrc/Umbraco/Program.cs
RenderController exemplesrc/Nanoxi/.../App.Core/Controllers/Umbraco/PageController.cs
SurfaceController exemplesrc/Nanoxi/.../App.Core/Controllers/Umbraco/SurfaceControllers/WidgetContactFormController.cs
Repository NPocosrc/Nanoxi/.../App.Repository/Repositories/ContactFormRepository.cs
DomainServicesrc/Nanoxi/.../App.Domain/Services/DomainService.cs
API dashboard versionsrc/Nanoxi/.../App.Api/Controllers/DashboardIntroApiController.cs

Contributors

No contributors

Changelog

No recent changes