Secondo i principi SOLID una classe non può dipendere da altre classi, le dipendenze devono essere iniettate. E 'semplice:Inversione di dipendenza. Creazione dell'oggetto
class Foo
{
public Foo(IBar bar)
{
this.bar = bar;
}
private IBar bar;
}
interface IBar
{
}
class Bar: IBar
{
}
Ma cosa succede se voglio la mia classe Foo di essere in grado di creare bar di, non conoscendo l'esatta esecuzione dietro IBar? mi viene in mente 4 soluzioni qui, ma tutti sembrano avere svantaggi:
- che iniettano il tipo di oggetto e l'utilizzo di riflessione
- utilizzando Generics
- utilizzando "Service Locator" e chiamando il Resolve () metodo.
- creando una classe di fabbrica separato e l'immissione nella Foo:
class Foo
{
public void DoSmth(IBarCreator barCreator)
{
var newBar = barCreator.CreateBar();
}
}
interface IBarCreator
{
IBar CreateBar();
}
class BarCreator : IBarCreator
{
public IBar CreateBar()
{
return new Bar();
}
}
ultimo caso sembra naturale, ma di classe BarCreator ha il codice troppo litle. Quindi, come pensi, qual è il migliore?
L'opzione 4 è la risposta corretta: http://stackoverflow.com/questions/1943576/is-there-a-pattern-for-initializing-objects-created-via-a-di-taintainer/1945023#1945023 –
Tuttavia, perché vuoi che Foo crei l'IBar? Sii consapevole delle Abstraction Leaky. –