Єдність - це просто контейнер IoC. Google StructureMap та спробуйте це замість цього. Я думаю, що трохи легше бавитися, коли речі IoC для вас нові.
В основному, якщо ви розумієте IoC, то ви розумієте, що те, що ви робите, - це перевернення керування, коли об’єкт створюється.
Без IoC:
public class MyClass
{
IMyService _myService;
public MyClass()
{
_myService = new SomeConcreteService();
}
}
З контейнером IoC:
public class MyClass
{
IMyService _myService;
public MyClass(IMyService myService)
{
_myService = myService;
}
}
Без IoC ваш клас, який покладається на IMyService, повинен створити конкретну версію сервісу, яку слід використовувати. І це погано з кількох причин (ви приєднали свій клас до конкретної конкретної версії IMyService, ви не можете легко перевірити його, не можете легко змінити його тощо)
За допомогою контейнера IoC ви "налаштовуєте" контейнер для вирішення цих залежностей для вас. Отже, використовуючи схему інжекцій на основі конструктора, ви просто передаєте інтерфейс залежності від IMyService в конструктор. Коли ви створите MyClass зі своїм контейнером, ваш контейнер вирішить залежність IMyService для вас.
Використовуючи StructureMap, конфігурація контейнера виглядає приблизно так:
StructureMapConfiguration.ForRequestedType<MyClass>().TheDefaultIsConcreteType<MyClass>();
StructureMapConfiguration.ForRequestedType<IMyService>().TheDefaultIsConcreteType<SomeConcreteService>();
Отже, те, що ви зробили, говорить контейнеру: "Коли хтось запитує IMyService, дайте їм копію SomeConcreteService." Ви також вказали, що коли хтось запитує MyClass, він отримує конкретний MyClass.
Це все, наприклад, контейнер IoC. Вони можуть зробити більше, але саме в цьому - вони вирішують залежність для вас, тому вам не доведеться (і вам не потрібно використовувати "нове" ключове слово у всьому коді).
Заключний крок: коли ви створюєте MyClass, ви зробите це:
var myClass = ObjectFactory.GetInstance<MyClass>();
Сподіваюся, що це допомагає. Не соромтеся надіслати мені електронну пошту.