Per quanto ho capito, SimpleIoc utilizza il metodo GetInstance per recuperare un'istanza di una classe registrata. Se l'istanza non esiste, la creerà. Tuttavia, questa istanza viene memorizzata nella cache e sempre recuperata, che riproduce lo schema del singleton.SimpleIoc: può fornire una nuova istanza ogni volta che è necessario?
Il mio pensiero è che non è necessario mantenere un'istanza di ViewModel in una memoria se c'è una piccola possibilità che questo ViewModel sarà necessario due volte, quindi mi piacerebbe creare una nuova istanza di esso ogni volta che è necessario . Se abbiamo stiamo avendo una fabbrica per ViewModels, avremo una proprietà come questa:
public MyViewMOdel MyViewModel
{
get { return SimpleIoc.Default.GetInstance<MyViewModel>(); }
}
questo usa pattern Singleton, che credo non sia delle migliori pratiche in tutti i casi. Per aggirare questo problema, mi fare questo:
public MyViewModel MyViewModel
{
get { return new MyViewModel(SimpleIoc.Default.GetInstance<ISomeInterface>()); }
}
Questo ha uno svantaggio che se mai cambiare un costruttore per MyViewModel, ho bisogno di aggiornare questa proprietà anche. Non un grosso problema, ma c'è ancora una sorta di dipendenza.
Come gestisci questo scenario e c'è qualcosa che mi manca? e perché è stato deciso di non restituire l'istanza non condivisa.
E un'altra domanda è, in MVVM Deep dive session Laurent utilizza il metodo GetInstance subito dopo aver registrato un particolare ViewModel, al fine di, come lui dice, assicurarsi che ci sia già un'istanza di questo ViewModel nel contenitore. Perché è esattamente necessario? Se stai recuperando un ViewModel tramite ViewModelLocator, lo creerai quando richiesto. Quindi, perché dovrei averli creati in anticipo?
Salve, Laurent, nel caso di un'istanza non condivisa, non importa se si utilizzano chiavi o meno (presumo che non siano presenti più istanze della stessa vista contemporaneamente). In entrambi i casi avrei bisogno di registrare/annullare la registrazione di un modello di vista, quindi avrei bisogno di tenere traccia di loro. Penso che sarebbe ancora un semplice Ioc se esistesse un'opzione di registro per istanze condivise e non condivise. Immagino che sarebbe solo necessario non aggiungere l'istanza creata nel contenitore? – Goran
La soluzione funziona solo se non viene utilizzata l'iniezione del costruttore (che non è una buona cosa). Nel caso in cui il contenitore si assume la responsabilità di iniettare le dipendenze, non c'è modo di dirgli di creare nuove istanze e iniettarle nel costruttore, vero? Sto cercando di evitare di chiamare SimpleIoC.GetInstance() nel mio codice in quanto a seconda del contenitore è una cattiva pratica. Come faccio a dire a SimpleIoC di creare sempre nuove istanze e iniettarle invece di memorizzare nella cache un'istanza? Mi sembra un semplice flag "cache" in SimpleIoC.Register sarebbe sufficiente. – TheAgent