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.*
| Projet | Responsabilite |
|---|---|
| App.Core | Controllers (RenderController, SurfaceController), vues Razor, ViewComponents (widgets), scripts, middleware, helpers |
| App.Api | API REST (UmbracoApiController) : DashboardIntro (version dashboard), Event, Install (structure/uSync), Media, Test |
| App.Domain | Services metier (DomainService) : resolution du Domain courant, skin, proprietes de site |
| App.Data | Modeles de donnees + SearchService (Examine) |
| App.Repository | Repositories NPoco (ContactFormRepository) + mappings |
| App.Interface | Contrats DI organises par dossier : Domain, Email, Google, I18n, IO, Media, Navigation, Recaptcha, ... |
| App.Model | View models (ViewModel/Component/, ViewModel/Page/, ViewModel/Base/) |
| App.Configuration | Classes d'options IOptions<T> (SmtpOptions, Recaptchav3Options, NewsletterOptions, Infomaniak, ...) |
| App.Cache | SitemapCacheService et caches runtime |
| App.I18n | I18nService : lookup dictionnaire, resolution culture (fr-CH, de-CH, en-GB) |
| App.Mail | EmailService : SMTP + rendu de templates Razor via IViewRender |
| App.Navigation | NavigationService : menus / fil d'ariane depuis l'arbre de contenu |
| App.Validation | Validators FluentValidation (contact form, newsletter) |
| App.UmbracoForms | Integration Umbraco Forms, SiteComposer (IComposer), workflow custom d'envoi de mail, theming |
| App.Util | Helpers : ViewRender (IViewRender), utilitaires string / reseau |
| App.Notification | Handlers de notifications Umbraco (ContentPublishing/Published, invalidation registre media) |
| App.Network | Securite reseau : NetworkSecurityService, NetworkConditionsService |
| App.Tier | Operations niveau multi-tenant / domaine |
| App.Library | Services partages / providers |
| App.Definition | Constantes / definitions (AppDefs_*.cs) : cles de dictionnaire, alias |
| App.PublishedModels | Modeles ModelsBuilder generes (SourceCodeAuto) - NE PAS editer |
| App.Backoffice | Personnalisation backoffice (2FA / provider TwoFactor) |
| App.Mvc | Controllers / tag helpers |
Flux de requete (rendu de page)
- Entree :
src/Umbraco/Program.csconfigure le routing Umbraco + routes custom (ex. Sitemap, mappees apresMapUmbracoRoute). - Controller : un
RenderControllergere le contenu par document type. Existants :PageController,PostController,FeedController,EventController,EventsController,SitemapController(App.Core/Controllers/Umbraco/). - Modele :
CurrentPage(IPublishedContent) enveloppe par un modele ModelsBuilder. Le controller construit un view model composite et rend la vue~/Views/<Type>.cshtml. - Services : injectes par constructeur (DomainService, NavigationService, I18nService, Cache, ...).
- Widgets : la vue rend des
ViewComponent(un par widget) via le BlockGrid de la page. - 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.
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, desAddCssBundle(...)(bundle-default-head, head-component, footer-component, blockgrid, feed, post, form, widget*, ...) etAddJavaScriptBundle(...)(bundle-calendarEvents, ...). C'est WebOptimizer qui assemble et minifie a la volee, pas un bundler frontend. - Middleware : garde 404 sur
/mediapour les medias supprimes/corbeille (LiveMediaRegistryInvalidationHandler+ middleware), pose AVANTapp.UseUmbraco().
Acces aux donnees (NPoco)
Pour les tables custom (nanoxi_*), pattern repository sur IScopeProvider :
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 :
SitemapCacheServiceet caches runtime Umbraco (AppCaches). - Recherche :
SearchServicesur Examine (Lucene). - i18n :
I18nServicesurILocalizationService. - Securite :
NetworkSecurityService, garde sur l'acces aux medias supprimes.
Fichiers cles
| Sujet | Fichier |
|---|---|
| DI / composition / bundles | src/Umbraco/Program.cs |
| RenderController exemple | src/Nanoxi/.../App.Core/Controllers/Umbraco/PageController.cs |
| SurfaceController exemple | src/Nanoxi/.../App.Core/Controllers/Umbraco/SurfaceControllers/WidgetContactFormController.cs |
| Repository NPoco | src/Nanoxi/.../App.Repository/Repositories/ContactFormRepository.cs |
| DomainService | src/Nanoxi/.../App.Domain/Services/DomainService.cs |
| API dashboard version | src/Nanoxi/.../App.Api/Controllers/DashboardIntroApiController.cs |

