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
Effettuare chiamate con versioning da Blazor ad ASP.NET Core
Usare una container image come runner di GitHub Actions
Utilizzare i primary constructor in C#
Usare ASP.NET Core dev tunnels per testare le applicazioni su internet
Controllare gli accessi IP alle app con Azure Container Apps
Effettuare lo stream della risposta in ASP.NET Core tramite IAsyncEnumerable
Sostituire la GitHub Action di login su private registry
Specificare il versioning nel path degli URL in ASP.NET Web API
Effettuare il download di un file via FTP con la libreria FluentFTP di .NET
Usare il versioning con i controller di ASP.NET Core Web API
Mascherare l'output di un valore all'interno dei log di un workflow di GitHub
C# 12: Cosa c'è di nuovo e interessante