Nell'articolo sull'uso di PRISM per realizzare Windows Store app (https://www.winrtitalia.com/articoli/windows8/XAML-Windows-8.1-WinRT-PRISM.aspx) abbiamo introdotto l'utilizzo di Unity come dependency injection container per l'istanza dei ViewModel e altri oggetti.
L'utilizzo di Unity, tuttavia, non e' obbligatorio: la risoluzione dei VieModel viene invocata dal ViewModelLocator attraverso il metodo Resolve esposto da MvvmAppBase.
Il metodo Resolve accetta come parametro il Type di una classe (nel nostro contesto, appunto, un ViewModel), è virtual e la sua implementazione crea l'istanza della classe attraverso reflection:
protected virtual object Resolve(Type type) { return Activator.CreateInstance(type); }
Un aspetto interessante è la possibilita' di definire una strategia di recupero del Type di un ViewModel in relazione ad una View: il ViewTypeToViewModelTypeResolver predefinito nel ViewModelLocator è proprio quello in cui è fissata la convenzione delle folder Views,ViewModels e del suffisso ViewModel al nome di una View.
private static Func<Type, Type> defaultViewTypeToViewModelTypeResolver = viewType => { var viewName = viewType.FullName; viewName = viewName.Replace(".Views.", ".ViewModels."); var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName; var viewModelName = String.Format(CultureInfo.InvariantCulture, "{0}ViewModel, {1}", viewName, viewAssemblyName); return Type.GetType(viewModelName); };
Con il metodo SetDefaultViewTypeToViewModelTypeResolver di ViewModelLocator possiamo definire il ViewTypeToViewModelTypeResolver ed impostare le proprie convenzioni di associazione tra View e ViewModel.
Oltre a questo, qualora avessimo bisogno di istanziare manualmente i ViewModel, anche con oggetti passati come parametri nel costruttore, possiamo usare il metodo Register del ViewModelLocator e definire il delegate per restituire il ViewModel.
ViewModelLocator.Register(typeof(MainPage).ToString(), () => new MainPageViewModel(_dataRepository, NavigationService));
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Applicare un firewall web con Azure Front Door
Supportare l'autenticazione basata su API Key in ASP.NET Core
ASP.NET Core 3 to the max
Abilitare lo scrolling virtuale su una lista con molti elementi con Angular CDK
Gestione della dimensione del testo nella Universal Windows Platform
Aggiungere un metodo Format alla classe string in TypeScript
Migliorare la leggibilità degli URL con ASP.NET Core 2.2
Browser-based Web Apps with .NET and Blazor (.NET Conference Italia 2018)
Modernizzare le applicazioni desktop con .NET Core 3 e XAML Island
Implementare un blocco territoriale in ASP.NET Core
Importare ed esportare dati con Azure Cosmos DB Data Migration tool
Fade Header con la Universal Windows Platform
I più letti di oggi
- Introduzione ad Azure DevOps release management
- Utilizzare la funzionalità ref all'interno di un component React
- Chiamare direttamente un numero di telefono con HTML5
- DevOps in a .NET world
- What's new in Xamarin and Visual Studio for macos
- Building modern web apps with Blazor
- WPF and Windows Apps in .NET Core 3