Un localizzatore di servizi porta a un codice più semplice in questa situazione?

1

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:

  1. ItemsListViewModel ha un riferimento a IService e può utilizzare questo riferimento per creare istanze di ItemViewModel .
  2. ItemsListViewModel ha un riferimento a una fabbrica astratta che comunica con il contenitore DI e crea le istanze. Intendo questo: link
  3. 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:

  1. 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.
  2. In questo caso dobbiamo avere un altro livello di astrazione non necessaria (alcune classi creano un'altra classe in modo astratto).
  3. 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?

    
posta Patrik Bak 24.08.2018 - 15:34
fonte

1 risposta

1

Vorrei andare con 2, l'astrazione non è necessaria se devi creare un'istanza determinata in fase di esecuzione e tenerla accoppiato in modo lasco.

Il problema con 3 è che stai collegando ItemViewModel al contenitore DI.

    
risposta data 24.08.2018 - 16:56
fonte

Leggi altre domande sui tag