Attualmente sto lavorando a un software che utilizza C # .NET e WPF con il pattern MVVM.
Sebbene il software sia quasi finito, ho discusso a lungo della nostra architettura e vorrei ricevere le vostre opinioni / consigli sul lato delle convenzioni / buone pratiche.
L'architettura corrente è la seguente:
- Progetto /
- DataContext /
- Modelli /
- Engine3D /
- ...
- Programmi di utilità /
- Convertitori /
- Statica /
- ViewModels /
- Griglie /
- Menu /
- di Windows /
- ...
- Vista /
- Griglie /
- Menu /
- di Windows /
- ...
Cartella Modelli:
Contiene i modelli dal modello MVVM.
La cartella Modelli è organizzata per caratteristica, il che significa che ha nidificato cartelle denominate in base a una funzionalità o contesto, ad esempio Modelli / Motore3D per ogni modello relativo al 3D.
Non aggiungiamo mai la parola "Modello" come suffisso, i file sono denominati [Feature].cs
Ad esempio, Project.cs
, Model3D.cs
, Animation.cs
, ecc.
Cartella visualizzazioni:
Contiene le viste dal pattern MVVM.
La cartella Views è organizzata da WPF Control, il che significa che ha nidificato le cartelle nominate dopo un controllo WPF, ad esempio Views / Windows per ogni vista relativa a una finestra WPF, o View / Grids, ecc ...
I file sono denominati [Caratteristica] [ControlType] .xaml con:
- [Caratteristica]: la "funzionalità" implementata / descritta dalla vista, ad esempio "CreateProject" per una funzione che crea un progetto, Display3DModel per una griglia che visualizza un Model3D (utilizzando librerie 3D), ecc ...
- [ControlType]: il tipo di controllo "xaml" rappresentato dal file, che è una finestra, un UserControl, una griglia, ecc. Ad esempio, una finestra che visualizza le preferenze di sistema si chiamerà SystemPreferencesWindow.xaml, e una griglia che contiene l'elenco di tutti i progetti sarebbe ProjectsListGrid.xaml. Ad esempio, CreateProjectWindow.xaml, SystemPreferencesWindow.xaml, Display3DModelGrid.xaml, ProjectsListGrid.xaml
Cartella ViewModels:
Contiene i ViewModels dal pattern MVVM.
La cartella ViewModels copia la cartella Views in termini di architettura, il che significa che ha nidificato cartelle denominate in seguito a un controllo WPF, ad esempio ViewModels / Windows per ogni ViewModel correlato a una finestra WPF o ViewModels / Grids.
Un file ViewModel ha lo stesso nome del relativo file View, con il suffisso "ViewModel": i file sono denominati [Feature] [ControlType] ViewModel.cs con:
Ad esempio, in base a View = > ViewModel: CreateProjectWindow.xaml = > CreateProjectWindowViewModel.cs, OpenProjectWindow.xaml = > OpenProjectWindowViewModel.cs, etc ...
Cartella DataContext:
Contiene i file DataContext, es. file relativi a un determinato contesto nel software; queste sono classi che non sono ViewModels o Models, sono per lo più accessibili "staticamente" e corrispondono a un contesto molto specifico nel flusso di esecuzione del software, quindi non appartengono alla cartella Utilities. Queste classi sono ad esempio la classe Session che tiene i valori delle sessioni riguardanti l'utente come le sessioni delle tecnologie web.
Cartella Utilità:
Contiene un set di strumenti file / classi di vari obiettivi:
- Classi di definizione, che forniscono meccanismi di sistema all'intero software come ObservableObject.cs, DelegateCommand.cs e RelayCommand.cs che consentono l'associazione dati MVVM, ecc ...
- Cartella Utilities / Converters: Classi convertitori ...
- Cartella Utilities / Statices: contiene classi di operazioni statiche che accettano un input e restituiscono un output, ad esempio FileOperations.cs, XWindow.cs (non preoccuparsi del nome, è specifico del progetto) che raggruppa System.Windows come InvokeWindow () e CloseWindow () in modo che sia più facile manipolare System.Windows nel codice, Model3DImporter.cs che importa facilmente i modelli 3D, SerializationManager.cs per le operazioni di serializzazione, ecc ...
Classi con costanti:
Alcune classi hanno bisogno di valori di costanti e poiché questi valori devono essere accessibili praticamente ovunque nel codice, non abbiamo archiviato questi valori costanti nelle classi correlate ma in una classe "sorella".
Queste classi "sorelle" sono le seguenti:
// The sister class
public static class Model3DConstants
{
private static readonly IList<String> supportedFileExtensions = ...
}
// The original class
public class Model3D
{
}
Come ho detto all'inizio del mio messaggio, mi piacerebbe le tue idee / consigli sulle nostre convenzioni di architettura / denominazione, perché sono certo che ci manca qualcosa ma non sappiamo cosa.
Stiamo facendo l'esatto contrario di ciò che dovrebbe essere fatto in un software MVVM C # .NET corretto usando WPF, quali sono i difetti e / o cose che dovremmo modificare
Non esitare a partecipare al dibattito né a porre domande né a chiedermi se non sono chiaro riguardo la descrizione di cui sopra.