8

Dopo aver ascoltato il Clean Code Talks, ho capito che dovremmo usare le fabbriche per comporre oggetti. Così, per esempio, se un House ha un Door e Door ha un DoorKnob, in HouseFactory creiamo un nuovo DoorKnob e passarlo al costruttore Door, e quindi passare tale nuova Door oggetto al costruttore di House.Iniezione del Costruttore - Iniettiamo anche le fabbriche?

Ma per quanto riguarda la classe che utilizza il House(diciamo il nome della classe è ABC)? Dipenderà dallo HouseFactory, giusto? Quindi passiamo allo HouseFactory nel costruttore di ABC? Non dovremo superare un sacco di fabbriche nel costruttore in quel modo?

risposta

9

Rimanendo con l'esempio Porta e maniglia, non si inietta una fabbrica - si inietta il DooKnob stesso:

public class Door 
{ 
    private readonly DoorKnob doorKnob; 

    public Door(DoorKnob doorKnob) 
    { 
     if (doorKnob == null) 
      throw new ArgumentNullException("doorKnob"); 

     this.doorKnob = doorKnob; 
    } 
} 

fabbriche sono in vista in questo livello.

Casa, d'altra parte, dipende dalla porta, ma non sulla maniglia della porta:

public class House 
{ 
    private readonly Door door; 

    public House(Door door) 
    { 
     if (door == null) 
      throw new ArgumentNullException("door"); 

     this.door = door; 
    } 
} 

Questo mantiene opzioni aperte finché alla fine si avete a comporre tutto nel dell'applicazione Composition Root:

var house = new House(new Door(new DoorKnob())); 

È possibile utilizzare un contenitore DI per comporre a questo livello, ma non è necessario. Nessuna fabbrica è coinvolta.

+0

grazie per la risposta. una domanda sulla radice della composizione. Quale dovrebbe essere la radice della composizione quando si tratta di una chiamata EJB o di un servizio web? È il metodo chiamato stesso? –

+0

Quelli sono specifici di Java con cui non sono familiare, ma come una composizione generale del concetto accade molto tardi: quando non è possibile posticiparlo ulteriormente. –

1

Se si inietta troppe fabbriche che sono un odore di codice chiamato constructor over-injection che indica che la classe sta facendo troppo.

Molti contenitori forniscono una funzionalità chiamata auto-factories. Ciò significa che generano fabbriche di tipo Func<T> automaticamente se sanno come generare T.

Castle Windsor ha una funzione avanzata denominata Typed Factory facilities che genera le implementazioni di un'interfaccia factory al volo.

C'è anche una porta di fabbriche digitate per Unity nello TecX project.

0

Se si finisce con Unity, ho recentemente implementato un equivalente di Castle Windsor Typed Factories for Unity. È possibile trovare il progetto allo https://github.com/PombeirP/Unity.TypedFactories e il pacchetto NuGet allo http://nuget.org/packages/Unity.TypedFactories.

L'utilizzo è la seguente:

unityContainer 
    .RegisterTypedFactory<IFooFactory>() 
    .ForConcreteType<Foo>(); 

Devi solo per creare l'interfaccia IFooFactory con un metodo che restituisce IFoo, e il resto è fatto per voi dalla libreria. Puoi risolvere IFooFactory e usarlo per creare oggetti IFoo immediatamente.

Problemi correlati