Unity - это просто «контейнер» 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. Они могут сделать больше, но в этом суть - они разрешают зависимости для вас, поэтому вам не нужно (и вам не нужно использовать ключевое слово «new» во всем коде).
Последний шаг: когда вы создаете свой MyClass, вы должны сделать это:
var myClass = ObjectFactory.GetInstance<MyClass>();
Надеюсь, это поможет. Не стесняйтесь, напишите мне.