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 : il compose le framework (DI, jobs, middleware) dans Program.cs et recoit au build les vues/assets copies depuis Nanoxi.
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), middleware, helpers, tag helpers |
| App.Api | API REST (UmbracoApiController) : dashboard, forms, events, media, PDF/OCR, recherche, imports |
| App.Domain | Services metier (DomainService) : resolution du Domain courant, skin, proprietes de site |
| App.Data | Modeles de donnees (Contact, LanguageLink, SimpleMedia, SitemapUrl, ...) + SearchService (Examine) |
| App.Repository | Repositories NPoco (IContactFormRepository/ContactFormRepository) + mappings (ContactFormMapping) |
| App.Interface | Contrats DI : IDomainService, IEmailService, Ii18nService, INavigationService, ISearchService, ... |
| App.Model | View models (ViewModel/Component/, ViewModel/Page/, ViewModel/Base/) |
| App.Configuration | Classes d'options IOptions<T> (CmsGlobalOptions, SmtpOptions, Recaptchav3Options, MapOptions, ...) |
| App.Cache | SitemapCacheService, MediaRelationService (sur AppCaches.RuntimeCache) |
| 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 (WidgetContactFormViewModelValidator, WidgetNewsletterViewModelValidator) |
| App.UmbracoForms | Integration Umbraco Forms, SiteComposer (IComposer), workflow custom SendRazorEmailNanoxi, theming |
| App.Util | Helpers : ViewRender (IViewRender), StringUtil, ServerUtil, utilitaires reseau |
| App.Notification | Handlers de notifications Umbraco (ContentPublished, MediaRelation, FullTextIndex, BlockGridElement, ...) |
| App.Network | Securite reseau : NetworkSecurityService, NetworkConditionsService (proxy, CORS, IP) |
| App.Tier | Operations niveau multi-site / domaine |
| App.Library | Services partages / providers |
| App.Definition | Constantes statiques (AppDefs.*) : cles de dictionnaire, alias |
| App.PublishedModels | Modeles ModelsBuilder generes (Domain, Page, Event, Post, ...) - NE PAS editer |
| App.Backoffice | Personnalisation backoffice : provider TwoFactor (Google Authenticator) |
| App.Mvc | Placeholder reserve (vide) |
Flux de requete (rendu de page)
- Entree :
src/Umbraco/Program.csconfigure le routing Umbraco + routes custom (Sitemap, Robots, RSS). - Controller : un
RenderController(ex.PageController : RenderController,App.Core/Controllers/Umbraco/PageController.cs) gere le contenu par document type.Index()->CurrentTemplate(CurrentPage). - Modele :
CurrentPage(IPublishedContent) est enveloppe par un modele ModelsBuilder (Page,Domain, ...). Le controller construit unComposedPageViewModel<Page, PageViewModel>et rend~/Views/Page.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(ex.WidgetContactFormController) : valide (FluentValidation) -> envoie le mail (IEmailService) -> log en base (IContactFormRepository).
Composition & DI
- Point central :
src/Umbraco/Program.cs(enregistrements ~lignes 55-260).csharpservices.AddUmbraco(builder.Environment, builder.Configuration) .AddBackOffice().AddWebsite().AddDeliveryApi() .AddComposers() .SetContentLastChanceFinder<FourZeroFourContentFinder>() .AddNotificationHandler<...>() // media relation, OCR, full-text index, ... .Build(); - Services Nanoxi enregistres en
Scoped(Ii18nService, IDomainService, IEmailService, INavigationService, ISearchService, ISitemapCacheService, ...).IPdfOcrServiceen Singleton. - Options bindees via
services.Configure<T>(config.GetSection("Nanoxi:CMS:...")). SiteComposer(App.UmbracoForms/SiteComposer.cs) : exclut les workflows Forms par defaut, ajouteSendRazorEmailNanoxi, branche les handlers de notification.- Jobs Quartz (TZ Europe/Zurich) : import PPB (08:00), import Infomaniak (08:05), indexation PDF (06:00).
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_ContactFormLog")], [PrimaryKey("Id")]. Le contenu editorial passe lui par l'API Umbraco (IPublishedContent / ModelsBuilder), pas par NPoco.
Preoccupations transverses
- Cache :
AppCaches.RuntimeCacheviaGetCacheItem(key, factory, ttl)(sitemap, relations media, resultats de recherche ~2 min). - Recherche :
SearchServicesur Examine (Lucene), exclut certains document types (websiteSettings, sitemap, general, company, affiliate). - i18n :
I18nServicesurILocalizationService. - Securite :
NetworkSecurityService, middlewareTrashedMediaGuardMiddleware(bloque l'acces aux medias supprimes).
Fichiers cles
| Sujet | Fichier |
|---|---|
| DI / composition | src/Umbraco/Program.cs |
| Composer | src/Nanoxi/.../App.UmbracoForms/SiteComposer.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 |
Contributors
No contributors
Changelog
No recent changes

