Unity to tylko „kontener” IoC. Google StructureMap i zamiast tego wypróbuj. Myślę, że trochę łatwiejsze do zrozumienia, kiedy rzeczy IoC są dla ciebie nowe.
Zasadniczo, jeśli rozumiesz IoC, rozumiesz, że to, co robisz, to odwracanie kontroli, kiedy obiekt zostanie utworzony.
Bez IoC:
public class MyClass
{
IMyService _myService;
public MyClass()
{
_myService = new SomeConcreteService();
}
}
Z kontenerem IoC:
public class MyClass
{
IMyService _myService;
public MyClass(IMyService myService)
{
_myService = myService;
}
}
Bez IoC Twoja klasa, która korzysta z IMyService, będzie musiała wprowadzić nową konkretną wersję usługi do użycia. Jest to złe z wielu powodów (powiązałeś swoją klasę z konkretną konkretną wersją IMyService, nie możesz jej łatwo przetestować jednostkowo, nie możesz jej łatwo zmienić itp.)
Za pomocą kontenera IoC „konfigurujesz” kontener, aby rozwiązać te zależności za Ciebie. Tak więc w przypadku schematu iniekcji opartego na konstruktorze wystarczy przekazać interfejs do zależności IMyService do konstruktora. Gdy utworzysz MyClass z kontenerem, Twój kontener rozwiąże za Ciebie zależność IMyService.
Korzystając ze StructureMap, konfiguracja kontenera wygląda następująco:
StructureMapConfiguration.ForRequestedType<MyClass>().TheDefaultIsConcreteType<MyClass>();
StructureMapConfiguration.ForRequestedType<IMyService>().TheDefaultIsConcreteType<SomeConcreteService>();
Więc to, co zrobiłeś, to powiedzenie kontenerowi: „Gdy ktoś zażąda usługi IMyService, przekaż mu kopię SomeConcreteService”. Określono również, że gdy ktoś prosi o MyClass, otrzymuje konkretną MyClass.
To wszystko, co naprawdę robi kontener IoC. Mogą zrobić więcej, ale o to właśnie chodzi - rozwiązują zależności za Ciebie, więc Ty nie musisz (i nie musisz używać słowa kluczowego „new” w całym kodzie).
Ostatni krok: kiedy tworzysz MyClass, zrobiłbyś to:
var myClass = ObjectFactory.GetInstance<MyClass>();
Mam nadzieję, że to pomoże. Zapraszam do e-maila.