La composizione dovrebbe succedere indipendentemente da cosa?

1

Mi sento come se dovessi essere in grado di registrare tutti i miei componenti nel contenitore radice della composizione dell'applicazione indipendentemente dallo stato corrente dell'ambiente, anche nel caso in cui l'ambiente manchi di parti di configurazione richieste per il corretto funzionamento di alcuni dei suoi componenti .

Attualmente, a volte mi imbatto in codice che ad esempio utilizza la funzionalità di Castle Windsor Dependency.OnValue che consente al codice personalizzato dal contenitore di fornire valori del costruttore. Quando un tale codice personalizzato fallisce, l'avvio dell'applicazione non riesce nella fase di composizione, anche prima dell'inizio dell'inizializzazione della classe.

Mi sembra che ogni errore nella fase di composizione che non è di preoccupazione per il quadro IoC (come "la dipendenza circolare rilevata") è in realtà un sintomo di un problema di separazione improprio. Quindi sono tentato di refactoring tali usi di Dependency.OnValue in un componente di configurazione che potrebbe ancora fallire, ma più tardi.

D'altro canto, la regola di fail fail suggerirebbe che è bello che il sistema non inizi a funzionare anche senza che alcuni importanti prerequisiti ambientali siano soddisfatti.

Che cosa suggeriresti?

Modifica: esempio di codice:

public static IWindsorContainer Compose()
{
    var container = new WindsorContainer();
    container.Register(
        // lots of components there

        Component
            .For<IService>()
            .ImplementedBy<DefaultService>()
            .DependsOn(Dependency.OnValue<string>(Configuration.GetString("SomeKey")))
        //                                                      ^ this can fail

        // lots of components there
    );
    return container;
}

Ora, test unitario come questo:

[TestMethod]
public void CompositionDoesntContainCycles()
{
    try
    {
        var container = CompositionRoot.Compose();
    }
    catch (SomeKindOfCycleExceptionThrownByWindsor)
    {
        Assert.Fail();
    }
}

fallirà perché ho bisogno di simulare la configurazione come Compose () fa due, non una cosa.

    
posta Lukáš Lánský 02.05.2016 - 14:29
fonte

1 risposta

9

Should composition happen no matter what?

No.

Se questa è una risposta abbastanza buona per te, non è necessario leggere il resto.

Come ogni cosa nella programmazione, non dovresti usare un approccio di programmazione solo perché qualcuno l'ha menzionato da qualche parte e ha detto che una mela è migliore di una bistecca di manzo.

Sì, una bistecca di manzo potrebbe essere migliore per le tue papille gustative se ami la carne, ma puoi essere abbastanza sicuro che un cavallo preferirebbe invece la mela.

Sebbene l'analogia sia davvero strana, con la programmazione è la stessa cosa. Non tutti i modelli di progettazione sono adatti a tutti i problemi e non si dovrebbero usare schemi di progettazione per realizzare un'applicazione, i modelli di progettazione non dovrebbero essere il vostro mantra. Dovrebbero emergere naturalmente durante il processo di sviluppo dell'applicazione.

Vuoi utilizzare la composizione (nei casi non limitati ma inclusi) quando vuoi:

(Tutti i seguenti presuppongono che tu stia utilizzando la composizione sotto forma di dipendenza da dipendenza).

  • disaccoppiamento delle dipendenze
  • rendono abbastanza ovvio ciò che la classe dipende da tutti gli utenti di detta classe
  • vuoi testare una classe senza alcuna conoscenza del resto della tua applicazione (mocking)

Se nessuna di queste è la tua preoccupazione o non riguarda la parte specifica dell'applicazione che stai modellando, non hai proprio bisogno di un'iniezione di dipendenza.

Per rispondere alla tua specifica preoccupazione, se ho capito bene la tua domanda, stai dicendo che un'applicazione non dovrebbe fallire durante la fase di cablaggio (durante la costruzione del grafico degli oggetti) solo perché alcune parti richieste di configurazione mancante.

Non sono assolutamente d'accordo. Ecco perché sono obbligatori, devono essere impostati e, se necessario, posso solo supporre che l'applicazione non possa funzionare senza di essi.

Se l'applicazione non ha bisogno delle dipendenze, quindi della configurazione dall'ambiente, non sono realmente necessarie e deve essere fornita un'implementazione predefinita quando non è specializzata.

Personalmente non ho lavorato con Castle Windsor, ma non penso che la struttura sia importante, le regole si applicano ovunque.

    
risposta data 02.05.2016 - 16:07
fonte

Leggi altre domande sui tag