Здравствуйте, Sharov, Вы писали:
S>Здравствуйте, okon, Вы писали:
O>>после создания контейнера вызывается ресолв рута. O>>Контейнер упоминается только в одном месте в методе CreateContainer и более он не требуется
O>>
S>Он будет упоминаться в каждом классе, где как минимум требуется RootClass или еще чего. Т.е. опять же, его всюду придется инжектить, хотя бы через конструктор класса, там же, в конструкторе, получить от него S>все необходимое и забыть про него.
Для RootClass не совсем я понял, например если нам нужен RootClass где-то внутри мы просто укажем его в конструкторе
Вот например, все разресолвится без передачи контейнера
public class RootClass
{
RootClass( Foo foo)
{
}
}
public class MyClass
{
public MyClass( RootClass root)
{
}
}
public class Foo
{
Foo( Func<MyClass> myClassFactory)
{
var myClass = myClassFactory();
}
}
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Здравствуйте, okon, Вы писали:
O>Возможно, но пока не понятно как внутри будет выглядеть Factory.CreateSomething, ведь в ней придется либо создавать инстансы вручную, либо как-то ресолвить зависимости.
Не нужно городить огород с фабриками-обёртками над контейнером. Фабрика должна просто создавать экземпляры конкретных классов, передавая им все долгоживущие зависимости через себя. Смысл такой фабрики в том, что она создаётся сразу, держит в себе нужные зависимости, и по запросу создаёт короткоживущие объекты, которым нужны эти зависимости.
Re: как ресолвить не передавая ссылки на контейнер ( DI )
Здравствуйте, okon, Вы писали:
O>Пишут что передавать ссылку на IContainer плохо
Под плохо здесь имелось ввиду случай когда класс получает контейнер и сам тянет из него свои зависимости, а не получает их через аргументы конструктора. Если у нас какой-то класс постоянно создаёт какие-то объекты, что часто и бывает, то он зависит от фабрики этих объектов, вот пусть контейнер фабрику ему и передает в качестве зависимости.
P.S. В качестве фабрики, часто передаётся другой экземпляр контейнера "заряженного" под этот класс. Так у нас и все зависимости прописаны в одном месте и класс не сможет насоздавать ни чего лишнего.
Здравствуйте, okon, Вы писали:
O>Пишут что передавать ссылку на IContainer плохо, O>а как быть если нужно в процессе вычислений создать экземпляр класса и проинициализировать его поля, например с передачей контейнера, например O>Как такие сценарии правильно строятся без передачи и хранения ссылок на контейнеры ?
class a
{
private Func<B> _getB;
public A(Func<B> getB)
{
}
IEnumerable<B> CalculateSomething()
{
return Enumerable.Range(1,100).Select( i => _getB());
}
}