Как стать автором
Обновить

Комментарии 18

как-то все слишком сложно по сравнению с MEF
Спасибо. Очень полезная статья. По больше бы таких.
Вы знаете, при всей моей любви к принципу IoC, простые примеры с контейнерами, к сожалению, явно не идут на пользу популяризации такой модели сборки ПО из компонент :(
Почему?
Потому что для таких простых примеров

var svc = new MyService(10);

выглядит куда лучше, чем

var uc = new UnityContainer();
uc.RegisterType<IService, MyService>();
uc.RegisterType(new InjectionConstructor(10));
var svc = uc.Resolve();

Пользователь скажет, что он «в гробу видел ваши контейнеры», и будет прав =)

P.S. Кстати, как в свете описанного примера будет выглядеть такой код, если его переписать на использование Unity?

var svc10 = new MyService(10);
var svc15 = new MyService(15);
На мой взгляд, человек, заинтересовавшийся IoC, через призму небольших примеров, видит то, как он будет применять IoC в своих реальных проектах, и его вряд ли отпугнут такие примеры.
Вот и вы употребляете «отпугнуть», что как бэ намекаэ… :)

>> P.S. Кстати, как в свете описанного примера будет выглядеть такой код, если его переписать на использование Unity?

А на этот вопрос вы не могли бы ответить?
:))) этапять
не могли бы вы к этой статье и к последующим, добавить ссылки на предыдущие части?!
Добавил
спасибо.
А подскажите, пожалуйста, как сконфигурировать только через xml синглтон, реализующий два интерфейса?

class Impl : IA, IB {}

Я пробовал так:
<register type="Impl">
<lifetime type="singleton" />
</register>

<register type="IA" mapTo="Impl"/>
<register type="IB" mapTo="Impl"/>

Интстансы разные получились отчего-то :(
Кодом это просто сделать… а хочется декларативненько, через xml
Декларативность в XML на практике бесполезна и аукается потом кучей проблем при сопровождении. Поэтому если хочется DI/IoC то конфигурировать нужно через код. А если все таки нужна динамическая подмена компонентов — тогда смотреть MEF. А все эти страшные xml конфиги — ошибка природы.
Сделал в итоге дефолтную конфигурацию в коде, с возможностью переопределить в xml в экстренном случае.
пытался реализовать последний пример и не получается: myService.Randoms показывает Random[0]
где ошибка?

IUnityContainer container = new UnityContainer();
container.RegisterType(
new InjectionConstructor()); // use default constructor for new Random()
container.RegisterType(
new InjectionConstructor()); // use default constructor for new Random()
container.RegisterType
(new InjectionConstructor(
new ResolvedParameter()));

MyServiceWithArray myService = container.Resolve();
foreach (Random random in myService.Randoms)
{
Console.WriteLine(«Next: » + random.Next());
}
}

public class MyServiceWithArray
{
public Random[] Randoms { get; private set; }
public MyServiceWithArray(Random[] randoms)
{
Randoms = randoms;
}
}
public class MyRandom: Random
{
}

пытался реализовать последний пример и не получается: myService.Randoms показывает Random[0]
где ошибка?

IUnityContainer container = new UnityContainer();
container.RegisterType(
new InjectionConstructor()); // use default constructor for new Random()
container.RegisterType(
new InjectionConstructor()); // use default constructor for new Random()
container.RegisterType
(new InjectionConstructor(
new ResolvedParameter()));

MyServiceWithArray myService = container.Resolve();
foreach (Random random in myService.Randoms)
{
Console.WriteLine(«Next: » + random.Next());
}

public class MyServiceWithArray
{
public Random[] Randoms { get; private set; }
public MyServiceWithArray(Random[] randoms)
{
Randoms = randoms;
}
}
public class MyRandom: Random
{
}

Два вопроса:
1) James Covax действительно очень доходчиво объяснил, что такое IoC, вплоть до самостоятельной реализации простейшего IoC-контейнера. Он использовал так называемый static gateway, то есть создал статическую обертку для UnityContainer, чтобы в любом конструкторе иметь доступ ко всем зарегистрированным в контейнере типам. Насколько эта практика хороша?
2) Подскажите, как реализовать вот какую вещь. Пусть у нас есть сервис MyService и потребитель сервиса Consumer.
при этом
class Consumer{
public string DoSomething(string arg){
MyService service = new MyService(arg);
return service.GetSomething();
}
}
Подскажите, как приспособить этот код под IoC? У меня вызвал затруднение вот этот внутренний вызов конструктора с аргументами.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации