Imansible combinare Factory / DI

Supponiamo di avere qualche class Foo, che ha due dipendenze: un ISerializer e un IFileAccessHandler .

Ora questa class ha anche altre dipendenze, dipendenze funzionali. Non voglio che nessuno istanziando questa class in uno stato non valido, quindi avrei anche bisogno di passare un object dominio nel costruttore.

Ma come posso averlo gestito da IoC quando so anche quale object dominio passare nel momento in cui sto effettivamente creando la class Foo?

Ho trasformato l’object dominio in una proprietà che ho impostato da Factory. Quindi la Fabbrica fa una chiamata a Service Locator per ottenere una class “Foo” opportunamente istanziata con le sue dipendenze, e la riempie ulteriormente con l’object dominio corretto e la restituisce.

Ma è questo il modo migliore per andare? Avrei preferito avere la parte dell’object dominio del mio costruttore per renderla in apparenza che in realtà devi lavorare con “Foo”.

Qualche idea? Mi sto perdendo qualcosa qui?

La soluzione predefinita di DI quando non è ansible colbind un tipo concreto al momento della registrazione è utilizzare una Fabbrica astratta

Nel tuo caso, definirei un’interfaccia IFooFactory:

 public interface IFooFactory { Foo Create(DomainClass dc); } 

Ciò ti consentirà di definire un’implementazione concreta che conosce i tuoi servizi di infrastruttura.

 public class FooFactory : IFooFactory { private readonly ISerializer serializer; private readonly IFileAccessHandler fileHandler; public FooFactory(ISerializer serializer, IFileAccessHandler fileHandler) { if(serializer == null) { throw new ArgumentNullException("serializer"); } if(fileHandler == null) { throw new ArgumentNullException("fileHandler"); } this.serializer = serializer; this.fileHandler = fileHandler; } public Foo Create(DomainClass dc) { return new Foo(this.serializer, this.fileHandler, dc); } } 

In questo modo puoi proteggere gli invarianti della tua class Foo, permettendoti di stare con Constructor Injection .

Nel contenitore DI, è ansible registrare IFooFactory e l’implementazione corrispondente. Ovunque tu abbia un’istanza DomainClass e hai bisogno di un’istanza di Foo, dovresti prendere una dipendenza da IFooFactory e usarla.

Sono anche alle prese con questo problema. L’esempio di Mark è limitato dal fatto che FooFactory sta creando una class concreta Foo. Cosa accadrebbe se fosse stato creato un IFoo in cui l’implementazione viene determinata durante la configurazione di avvio? Ciò implicherebbe per ogni implementazione alternativa di IFoo (FooA, FooB, ecc.) Che occorresse un’implementazione concreta dello stabilimento corrispondente (FooAFactory, FooBFactory, ecc.). Questo mi sembra ridondante.

Se la fabbrica è definita allo stesso livello dell’implementazione e dell’inizializzazione del Container, non vedo la debolezza di fare riferimento al contenitore dalla fabbrica. Mantiene ancora i riferimenti del contenitore da perdite nel resto della vostra applicazione.

I migliori saluti,

Metro.