Re[10]: как ресолвить не передавая ссылки на контейнер ( DI
От: okon  
Дата: 24.05.18 11:53
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, okon, Вы писали:


O>>после создания контейнера вызывается ресолв рута.

O>>Контейнер упоминается только в одном месте в методе CreateContainer и более он не требуется

O>>
O>>void CreateContainer()
O>>{

O>>    container.Register<Func<MyClass>>( () => container.Resolve<MyClass>());

O>>     Root = container.Resolve<RootClass>(); 
O>>}

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();
    }
}
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Отредактировано 24.05.2018 11:55 okon . Предыдущая версия .
Re[3]: как ресолвить не передавая ссылки на контейнер ( DI )
От: Vladek Россия Github
Дата: 26.05.18 11:56
Оценка: 3 (1)
Здравствуйте, okon, Вы писали:

O>Возможно, но пока не понятно как внутри будет выглядеть Factory.CreateSomething, ведь в ней придется либо создавать инстансы вручную, либо как-то ресолвить зависимости.


Не нужно городить огород с фабриками-обёртками над контейнером. Фабрика должна просто создавать экземпляры конкретных классов, передавая им все долгоживущие зависимости через себя. Смысл такой фабрики в том, что она создаётся сразу, держит в себе нужные зависимости, и по запросу создаёт короткоживущие объекты, которым нужны эти зависимости.
Re: как ресолвить не передавая ссылки на контейнер ( DI )
От: Qulac Россия  
Дата: 26.05.18 12:14
Оценка: 3 (1)
Здравствуйте, okon, Вы писали:

O>Пишут что передавать ссылку на IContainer плохо

Под плохо здесь имелось ввиду случай когда класс получает контейнер и сам тянет из него свои зависимости, а не получает их через аргументы конструктора. Если у нас какой-то класс постоянно создаёт какие-то объекты, что часто и бывает, то он зависит от фабрики этих объектов, вот пусть контейнер фабрику ему и передает в качестве зависимости.


P.S. В качестве фабрики, часто передаётся другой экземпляр контейнера "заряженного" под этот класс. Так у нас и все зависимости прописаны в одном месте и класс не сможет насоздавать ни чего лишнего.
Программа – это мысли спрессованные в код
Отредактировано 26.05.2018 13:09 Qulac . Предыдущая версия .
Re: как ресолвить не передавая ссылки на контейнер ( DI )
От: 0x7be СССР  
Дата: 29.05.18 09:13
Оценка:
Здравствуйте, 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());
    }
}
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.