2016-04-11 8 views
5

Sto riscontrando un po 'di difficoltà nell'usare StructureMap per servizi in cui è presente un argomento nullable nel costruttore. CioèStructureMap che passa null nel costruttore

public JustGivingService(IRestClient restClient = null) 

Nella mia configurazione, con tutti gli altri servizi, sono solito in grado di farla franca con il minimo, in modo che il problema qui è probabilmente solo una mancanza di comprensione. Mi piacerebbe fare questo:

container.For<IJustGivingService>().Use<JustGivingService>() 

Tuttavia, a causa del parametro nullable, troverò che avrò bisogno di usare questo invece di farlo funzionare:

RestClient restClient = null; 
container.For<IJustGivingService>().Use<JustGivingService>() 
    .Ctor<IRestClient>("restClient").Is(restClient); 

Tuttavia, questo mi sento un po 'sporco e credo che questo sia un trucco per quello che sto cercando di ottenere piuttosto che il modo standard per farlo. Se c'è un modo migliore per farlo, le informazioni di accompagnamento sul perché sarebbero molto apprezzate.

+2

Una leggera alternativa è 'container.For () Utilizzare () ctor ("restClient") è (() => null); 'Elimina la variabile almeno – Thymine

+0

@Thymine Grazie mille! Questo è ciò che ha funzionato dopo 4 ore di sbattere la testa sul motivo per cui StructureMap non ha voluto risolvere la mia istanza con un parametro null nel mio costruttore. – silkfire

+0

@Thymine ty tanto !! – RPM1984

risposta

5

StructureMap non supporta i parametri facoltativi del costruttore e non dovrebbe. Come descritto in this blog post:

Una dipendenza opzionale implica che il riferimento alla dipendenza sarà nullo quando non viene fornito. I riferimenti nulli complicano il codice perché richiedono una logica specifica per il caso null. Invece di passare un riferimento null, il chiamante potrebbe inserire un'implementazione senza alcun comportamento, cioè un'implementazione del modello oggetto nullo. Ciò garantisce che le dipendenze siano sempre disponibili, il tipo può richiedere tali dipendenze e i test nulli temuti sono scomparsi. Questo significa che abbiamo meno codice da mantenere e testare.

Quindi la soluzione è quello di creare un'implementazione Null Object per IRestClient e registrare che l'attuazione in StructureMap.

Esempio:...

// Null Object pattern 
public sealed class EmptyRestClient : IRestClient { 
    // Implement IRestClient methods to do nothing. 
} 

// Register in StructureMap 
container.For<IRestClient>().Use(new EmptyRestClient()); 
+0

Interessante, quindi dovrei, ad esempio, rimuovere '= null' e creare un costruttore senza parametri? In tal caso, come faccio a impostare il valore predefinito come non parametrico? – ediblecode

+2

@jumpingcode, no, non si dovrebbe creare un costruttore predefinito. Ogni componente dovrebbe avere [esattamente un costruttore] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=97) che specifica tutte le dipendenze della classe. Quindi il tuo componente 'JustGivingService' dovrebbe avere il costruttore:' JustGivingService (IRestClient restClient) '(nota: senza' = null') e dovresti registrare anche l'implementazione 'IRestClient' vuota in StructureMap. – Steven

Problemi correlati