La factory ha bisogno di una lista di oggetti disponibili. Dovrebbe essere statico o no?

-1

Ho una lista di IReader che ho letto all'inizio del mio programma. In seguito ho bisogno di ReaderFactory per ottenere IReader appropriato in base a Extensions che può utilizzare. Il problema è che la fabbrica deve conoscere i lettori disponibili. Quindi ho due opzioni:

  1. Rendi statico ReaderFactory con il metodo static Get(string extension) e static Init(IEnumerable<IReader> readers) quale verrebbe chiamato da qualche parte nella mia classe iniziale.
  2. Crea IReaderFactory con costruttore e private IEnumerable<IReader> _readers e crea un'istanza di questo e passa tramite Dependency Injection .

La mia domanda è quale useresti in questa particolare situazione? Forse c'è anche una terza opzione che non conosco?

    
posta FCin 29.12.2016 - 13:56
fonte

3 risposte

0

Potrebbe essere pedante a questo punto, ma non credo che il modello di fabbrica sia appropriato per questa situazione.

Se mi venisse chiesto di scrivere il codice con una pistola alla testa, probabilmente farei un fornitore.

ReaderProvider {
    private IEnumerable<IReader> _readers;

    public ReaderProvider(IEnumerable<IReader> readers) {
        _readers = readers;
    }

    public IReader GetReaderForExtension(string extension) {
        ...
    }
}

Potresti creare questo servizio quando leggi il tuo elenco di lettori e inserisci il fornitore nel codice che richiedi al lettore.

Se c'è troppa disconnessione, potresti usare un singleton, ma generalmente tendo ad allontanarmi da loro quando posso.

Spero che questo aiuti.

    
risposta data 29.12.2016 - 22:36
fonte
0

Userei il n. 2 poiché sarebbe più facile da spegnere durante i test unitari. La fabbrica statica richiederebbe una sorta di derisione e intercettazione per isolare.

    
risposta data 01.07.2017 - 00:27
fonte
0

Qualsiasi elemento statico è difficile da testare e rappresenta anche dipendenze nascoste, poiché è possibile accedervi da qualsiasi luogo. Bad.

Prendi invece in considerazione l'utilizzo del tuo contenitore IoC, ma utilizzando l'ambito "singleton" , ad es con AutoFac scriverai questo:

container.RegisterType<IReaderFactory, ReaderFactory>().SingleInstance();

Il ReaderFactory può caricare i lettori quando si inizializza da solo. L'inizializzatore verrà chiamato una sola volta e la stessa istanza verrà iniettata, con i lettori precaricati, in ogni classe che dipende da esso.

Se lo fai in questo modo puoi ancora eseguire il test unitario, non hai nascosto alcuna dipendenza e hai mantenuto inversione corretta del controllo con una singola radice di composizione.

    
risposta data 01.08.2017 - 03:22
fonte