Ho cercato di iniettare i moduli dal mio ModuleCatalog nel mio ViewModel della Shell, ma non sto avendo molta fortuna ...Prism 2.1 Moduli iniettando nel ViewModel
Sto creando la ModuleCatalog nel mio Bootstrapper e il mio modulo sta arrivando sullo schermo dal suo inizializzatore senza problemi. Tuttavia, mi piacerebbe essere in grado di legare la mia lista di moduli a un contenitore con un DataTemplate che permettesse loro di essere lanciati da un menu!
Ecco il mio file Boostrapper, sarò l'aggiunta di ulteriori moduli volte va avanti, ma per ora, contiene solo il mio piuttosto artificioso "ProductAModule":
public class Bootstrapper : UnityBootstrapper
{
protected override void ConfigureContainer()
{
Container.RegisterType<IProductModule>();
base.ConfigureContainer();
}
protected override IModuleCatalog GetModuleCatalog()
{
return new ModuleCatalog()
.AddModule(typeof(ProductAModule));
}
protected override DependencyObject CreateShell()
{
var view = Container.Resolve<ShellView>();
var viewModel = Container.Resolve<ShellViewModel>();
view.DataContext = viewModel;
view.Show();
return view;
}
}
A seguito di questo, ecco la mia Shell ViewModel:
public class ShellViewModel : ViewModelBase
{
public List<IProductModule> Modules { get; set; }
public ShellViewModel(List<IProductModule> modules)
{
modules.Sort((a, b) => a.Name.CompareTo(b));
Modules = modules;
}
}
Come potete vedere, sto cercando di iniettare un elenco di IProductModule (a cui ProductAModule eredita alcune delle sue proprietà e metodi) in modo che possa poi essere associato a vista del mio Shell. C'è qualcosa VERAMENTE semplice mi manca o non può essere fatto usando Unity IoC? (L'ho visto fatto con l'estensione StructureMap per Prism)
Un'altra cosa ... Quando si esegue l'applicazione, nel momento in cui ShellViewModel viene risolto dal Contenitore in Bootstrapper, si riceve la seguente eccezione:
Risoluzione della dipendenza non riuscita, type = "PrismBasic.Shell.ViewModels.ShellViewModel", name = "". Il messaggio di eccezione è: L'attuale operazione di compilazione (chiave di build Chiave di compilazione [PrismBasic.Shell.ViewModels.ShellViewModel, null]) non riuscita: i moduli dei parametri non possono essere risolti quando si tenta di chiamare il costruttore PrismBasic.Shell.ViewModels.ShellViewModel (System.Collections .Generic.List`1 [[PrismBasic.ModuleBase.IProductModule, PrismBasic.ModuleBase, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null]] moduli). (Strategia tipo BuildPlanStrategy, indice 3)
Ad ogni modo, semplice eh ... sembra confuso ...
Qualsiasi aiuto sarebbe molto apprezzato!
Rob
Ciao Rory, grazie per la tua risposta. Scusate, potrei essere stato un po 'troppo ambiguo con la mia domanda ... Mi piacerebbe che i veri moduli stessi in ShellViewModule, io affronterò servizi da qualche parte lungo la linea! L'ordine di marcia di inizializzazione nel programma di avvio automatico è la seguente: - ConfigureContainer - GetModuleCatalog - CreateShell così ho sicuramente ottenuto il mio allineamento ModuleInfo a portata di mano, sono abbastanza semplicemente non utile per il legame contro senza la proprietà aggiuntive che contiene il mio IProductModule. Grazie Rory! –
Ciao di nuovo, ho usato l'attributo [Dipendenza] in precedenza (per Iniezione di proprietà).Sto cercando di iniettare nel costruttore qui, immagino che anche se stavo usando Property Injection, non sarebbe un proiettile d'argento! –
Ehi, Robert, mi dispiace per l'incomprensione. Ho appena notato che i documenti per quell'attributo sono comunque scaduti, quindi rimuoverò il collegamento tra un momento. Se si dà un'occhiata all'origine dell'UnityBootloader, si noterà che il contenitore è configurato con ModuleCatalog, ma non con i singoli moduli. La soluzione migliore è probabilmente quella di ignorare ConfigureContainer e registrare i moduli con il contenitore da soli, ma non dimenticare di chiamare l'implementazione di base. – Rory