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 : 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.*

ProjetResponsabilite
App.CoreControllers (RenderController, SurfaceController), vues Razor, ViewComponents (widgets), middleware, helpers, tag helpers
App.ApiAPI REST (UmbracoApiController) : dashboard, forms, events, media, PDF/OCR, recherche, imports
App.DomainServices metier (DomainService) : resolution du Domain courant, skin, proprietes de site
App.DataModeles de donnees (Contact, LanguageLink, SimpleMedia, SitemapUrl, ...) + SearchService (Examine)
App.RepositoryRepositories NPoco (IContactFormRepository/ContactFormRepository) + mappings (ContactFormMapping)
App.InterfaceContrats DI : IDomainService, IEmailService, Ii18nService, INavigationService, ISearchService, ...
App.ModelView models (ViewModel/Component/, ViewModel/Page/, ViewModel/Base/)
App.ConfigurationClasses d'options IOptions<T> (CmsGlobalOptions, SmtpOptions, Recaptchav3Options, MapOptions, ...)
App.CacheSitemapCacheService, MediaRelationService (sur AppCaches.RuntimeCache)
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 (WidgetContactFormViewModelValidator, WidgetNewsletterViewModelValidator)
App.UmbracoFormsIntegration Umbraco Forms, SiteComposer (IComposer), workflow custom SendRazorEmailNanoxi, theming
App.UtilHelpers : ViewRender (IViewRender), StringUtil, ServerUtil, utilitaires reseau
App.NotificationHandlers de notifications Umbraco (ContentPublished, MediaRelation, FullTextIndex, BlockGridElement, ...)
App.NetworkSecurite reseau : NetworkSecurityService, NetworkConditionsService (proxy, CORS, IP)
App.TierOperations niveau multi-site / domaine
App.LibraryServices partages / providers
App.DefinitionConstantes statiques (AppDefs.*) : cles de dictionnaire, alias
App.PublishedModelsModeles ModelsBuilder generes (Domain, Page, Event, Post, ...) - NE PAS editer
App.BackofficePersonnalisation backoffice : provider TwoFactor (Google Authenticator)
App.MvcPlaceholder reserve (vide)

Flux de requete (rendu de page)

  1. Entree : src/Umbraco/Program.cs configure le routing Umbraco + routes custom (Sitemap, Robots, RSS).
  2. Controller : un RenderController (ex. PageController : RenderController, App.Core/Controllers/Umbraco/PageController.cs) gere le contenu par document type. Index() -> CurrentTemplate(CurrentPage).
  3. Modele : CurrentPage (IPublishedContent) est enveloppe par un modele ModelsBuilder (Page, Domain, ...). Le controller construit un ComposedPageViewModel<Page, PageViewModel> et rend ~/Views/Page.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 (ex. WidgetContactFormController) : valide (FluentValidation) -> envoie le mail (IEmailService) -> log en base (IContactFormRepository).

Composition & DI

  • Point central : src/Umbraco/Program.cs (enregistrements ~lignes 55-260).
    csharp
    services.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, ...). IPdfOcrService en Singleton.
  • Options bindees via services.Configure<T>(config.GetSection("Nanoxi:CMS:...")).
  • SiteComposer (App.UmbracoForms/SiteComposer.cs) : exclut les workflows Forms par defaut, ajoute SendRazorEmailNanoxi, 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.RuntimeCache via GetCacheItem(key, factory, ttl) (sitemap, relations media, resultats de recherche ~2 min).
  • Recherche : SearchService sur Examine (Lucene), exclut certains document types (websiteSettings, sitemap, general, company, affiliate).
  • i18n : I18nService sur ILocalizationService.
  • Securite : NetworkSecurityService, middleware TrashedMediaGuardMiddleware (bloque l'acces aux medias supprimes).

Fichiers cles

SujetFichier
DI / compositionsrc/Umbraco/Program.cs
Composersrc/Nanoxi/.../App.UmbracoForms/SiteComposer.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

Contributors

No contributors

Changelog

No recent changes