Zgodnie z zasadami SOLID klasa nie może zależeć od innych klas, należy wstrzykiwać zależności. To proste:Inwersja zależności. Tworzenie obiektu
class Foo
{
public Foo(IBar bar)
{
this.bar = bar;
}
private IBar bar;
}
interface IBar
{
}
class Bar: IBar
{
}
Ale co, jeśli chcę, aby moje klasy Foo, aby móc tworzyć Bar, a nie znając dokładnej realizacji za IBAR? mogę myśleć o 4 rozwiązań tutaj, ale wszystkie z nich wydają się mieć wady:
- wstrzykiwanie typ obiektu i przy użyciu odbicia
- wykorzystujące Generics
- użyciu „lokalizatora usług” i nazywając determinacji () metoda.
- tworząc oddzieloną klasy fabrycznej i wstrzykiwanie go do 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();
}
}
ostatnim przypadku wydaje się naturalne, ale klasa BarCreator ma kod zbyt litle. Jak myślisz, co jest najlepsze?
Opcja 4 to poprawna odpowiedź: http://stackoverflow.com/questions/1943576/is-there-a-pattern-for-initializing-objects-created-via-a-di-container/1945023#1945023 –
Jednak dlaczego chcesz, aby Foo tworzyło IBar? Bądź świadomy nieszczelnych abstrakcji. –