Iniezione di un oggetto Immutable e un oggetto factory

0

Vedi il seguente codice (contenuto in un metodo IEnumerable):

int Quantity = (int)Math.Floor(ChangeRequired / CurrencyAmount);
ChangeDenomination = ChangeDenominationsFactory.Create(CurrencyAmount, Quantity);
yield return ChangeDenomination;

ChangeRequired = ChangeRequired - (ChangeDenomination.Amount * ChangeDenomination.Quantity);

ChangeDenominationsFactory e ChangeDenomination sono iniettati nel costruttore.

Come puoi vedere la classe ChangeDenomination ha un costruttore di argomenti zero - è immutabile.

Sto usando Castle Windsor. Ci sono due modi in cui posso configurarlo:

1) Introdurre un costruttore di argomenti zero in ChangeDenomination appositamente per Castle Windsor. 2) Configura Castle Windsor in modo che ChangeDenomination abbia gli argomenti necessari come segue:

Component.For<IDenomination, Denomination>().DependsOn(Dependency.OnValue("amount", 0.0M), Dependency.OnValue("quantity", 0))

Entrambi gli approcci funzionano come previsto. Quale è la "migliore pratica".

    
posta w0051977 15.06.2017 - 16:52
fonte

1 risposta

1

Vorrei inserire solo ChangeDenominationFactory . La factory utilizzerà quindi un tradizionale costrutto new per istanziare l'oggetto ChangeDenomination immutabile.

È perfettamente OK per questo tipo di pattern coesistere con DI e Castle Windsor. Le fabbriche ricevono un lasciapassare, poiché la loro unica responsabilità è la costruzione di oggetti. Se la fabbrica stessa ha delle dipendenze, quelle dovrebbero essere iniettate in fabbrica, in modo da poter isolare e testare l'unità.

Uno svantaggio qui è che è un po 'più difficile al test unitario ChangeDenomination , perché non è possibile isolare la logica del costruttore. Probabilmente è OK, purché il costruttore non dipenda da altro che dagli argomenti del costruttore. Sembra che sia così, dal momento che non stai iniettando nulla in esso.

Quindi la mia risposta è

3) Non registrare affatto ChangeDenomination con il tuo contenitore IoC.

Se vuoi essere un purista e avere un problema con questo perché pensi che sia "incoerente", sono curioso di sapere come pensi di usare il tuo contenitore IoC per creare istanze di altri oggetti immutabili, come string :)

    
risposta data 15.06.2017 - 18:06
fonte

Leggi altre domande sui tag