Recentemente ho letto con Iniezione delle dipendenze in .NET di Mark Seemann e ho tentato di applicare alcune delle cose che ho imparato in un nuovo progetto su cui sto lavorando, e io m stumped su un particolare scenario cercando di determinare quali dipendenze dovrei e non dovrei iniettare. Ho letto molte altre domande su SO e altrove che discutono scenari simili, ma in modo indiretto, e penso di aver ristretto la domanda concettuale sottostante a ciò che è nel titolo:
Una dipendenza stabile può avere una dipendenza volatile? In altre parole: se una dipendenza stabile ha una dipendenza volatile, la dipendenza stabile è davvero stabile?
Un rapido esempio:
public class MyClass
{
private IVolatileDependency1 _one;
private StableDependency _stable;
public MyClass(IVolatileDependency1 one, IVolatileDependency2 two)
{
_one = one;
_stable = new StableDependency(two)
}
}
public class StableDependency
{
private IVolatileDependency2 _two;
public StableDependency(IVolatileDependency2 two)
{
_two = two;
}
}
In questa situazione, MyClass
ha una dipendenza stabile che ho scelto di non iniettare, ma invece di creare un'istanza interna e di tenere la composizione. Tuttavia, quella dipendenza stabile ha una dipendenza volatile, che sto iniettando in MyClass
e passando al costruttore di StableDependency
.
Per qualche ragione, questo mi odora un po '. È abbastanza semplice in un esempio così semplice, ma posso vedere le cose sfuggire rapidamente in una situazione più complicata del mondo reale.
StableDependency
è veramente stabile, o dovrei compilarlo / risolverlo prima di costruire MyClass
e iniettarlo da lì? Davvero non prevedo che StableDependency
cambi o venga sostituito da un'altra implementazione, ma d'altra parte la pratica di passare le dipendenze attraverso le classi genitore ai loro figli (genitore / figlio nel senso della composizione) sembra esporre i dettagli del figli attraverso il genitore, che sarebbe una violazione della legge di Demetra.
EDIT: Modificato VolatileDependency1 e VolatileDependency2 alle interfacce per chiarire che sono intesi per essere soddisfatti da più possibili implementazioni (compatibile con LSP).
EDIT 2: Pensandoci ancora e leggendo la risposta di KeithS e il commento di default.kramer di seguito, fammi capire che forse non avrei dovuto chiamare StableDependency
come ho fatto io, perché non pensare che sia una dipendenza in primo luogo. Non è qualcosa che mi aspetto di avere più implementazioni per; è semplicemente un dettaglio di implementazione che MyClass
usa la composizione per contenere un StableDependency
, quindi la conoscenza di MyClass
su come costruire un StableDependency
non è un problema che non penso. La grande domanda è, StableDependency
fa ha una dipendenza su IVolatileDependency2
, quindi come faccio ad iniettare quella dipendenza? Ho ragione che a tutti gli effetti MyClass
ha una dipendenza su IVolatileDependency2
, e il fatto che passi solo la dipendenza fino a StableDependency
è un dettaglio di implementazione non correlato a DI?