Комментарии 18
как-то все слишком сложно по сравнению с MEF
+2
Спасибо. Очень полезная статья. По больше бы таких.
0
Вы знаете, при всей моей любви к принципу IoC, простые примеры с контейнерами, к сожалению, явно не идут на пользу популяризации такой модели сборки ПО из компонент :(
0
Почему?
0
Потому что для таких простых примеров
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);
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);
+1
На мой взгляд, человек, заинтересовавшийся IoC, через призму небольших примеров, видит то, как он будет применять IoC в своих реальных проектах, и его вряд ли отпугнут такие примеры.
+2
:))) этапять
-1
не могли бы вы к этой статье и к последующим, добавить ссылки на предыдущие части?!
+1
А подскажите, пожалуйста, как сконфигурировать только через xml синглтон, реализующий два интерфейса?
Я пробовал так:
<register type="Impl">
<lifetime type="singleton" />
</register>
<register type="IA" mapTo="Impl"/>
<register type="IB" mapTo="Impl"/>
Интстансы разные получились отчего-то :(
Кодом это просто сделать… а хочется декларативненько, через xml
class Impl : IA, IB {}
Я пробовал так:
<register type="Impl">
<lifetime type="singleton" />
</register>
<register type="IA" mapTo="Impl"/>
<register type="IB" mapTo="Impl"/>
Интстансы разные получились отчего-то :(
Кодом это просто сделать… а хочется декларативненько, через xml
0
Декларативность в XML на практике бесполезна и аукается потом кучей проблем при сопровождении. Поэтому если хочется DI/IoC то конфигурировать нужно через код. А если все таки нужна динамическая подмена компонентов — тогда смотреть MEF. А все эти страшные xml конфиги — ошибка природы.
0
пытался реализовать последний пример и не получается: 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
{
}
где ошибка?
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
{
}
0
пытался реализовать последний пример и не получается: 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
{
}
где ошибка?
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
{
}
0
Два вопроса:
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? У меня вызвал затруднение вот этот внутренний вызов конструктора с аргументами.
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? У меня вызвал затруднение вот этот внутренний вызов конструктора с аргументами.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
DI и IoC для начинающих, часть 2