Supponiamo di avere una classe come questa:
public interface IService
{
// Gets some data, possibly from a website / database
List<string> GetStrings();
}
public class ItemViewModel : BaseViewModel
{
// Some view-related data...
// Dependency
private readonly IService _service;
// Property to which we bind something in the view that needs to have dynamic up-to-date data, for example, a combo box
public List<string> Strings => _service.GetStrings();
// Constructor injection
public ItemViewModel(IService service)
{
_service = service;
}
}
Supponiamo di aver bisogno di un elenco di questi modelli di vista - ad esempio, abbiamo una classe ItemsListViewModel
, che si occupa di questi modelli, riempie i loro dati, li rimuove se necessario, ecc. Come creerà questa classe loro?
Posso pensare a 3 soluzioni su come affrontarlo:
-
ItemsListViewModel
ha un riferimento aIService
e può utilizzare questo riferimento per creare istanze diItemViewModel
. -
ItemsListViewModel
ha un riferimento a una fabbrica astratta che comunica con il contenitore DI e crea le istanze. Intendo questo: link - Modifica
ItemViewModel
in:
public class ItemViewModel : BaseViewModel
{
// Some view-related data...
// Dependency
private readonly IService _service;
// Property to which we bind something in the view that needs to have dynamic up-to-date data, for example, a combo box
public List<string> Strings => ServiceLocator.Get<IService>().GetStrings();
}
La mia opinione su queste soluzioni:
- In questo caso una classe ha una dipendenza che in realtà non ha bisogno di altro che di passarla ulteriormente. Questo approccio potrebbe portare a una super-classe che ha tutti i riferimenti e non fa nulla con loro, ma li tramanda.
- In questo caso dobbiamo avere un altro livello di astrazione non necessaria (alcune classi creano un'altra classe in modo astratto).
- Nessuna necessità di un'altra astrazione, entrambe le classi hanno un codice semplice e leggibile. Questa sembra la soluzione migliore per me.
Come risolveresti questo? Esiste la "migliore" soluzione?