Информация об изменениях

Сообщение Re[2]: как ресолвить не передавая ссылки на контейнер ( DI ) от 19.05.2018 5:06

Изменено 19.05.2018 5:07 okon

Re[2]: как ресолвить не передавая ссылки на контейнер ( DI )
Здравствуйте, Doc, Вы писали:

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


O>>Как такие сценарии правильно строятся без передачи и хранения ссылок на контейнеры ?


Doc>Задача состоит в создании экземпляра класса так ведь? А подобную задачу решат шаблон Factory.

Doc>
Doc>public class A 
Doc>{
Doc>    private IMyFactory _myFactory;
    
Doc>    public A (IMyFactory myFactory)
Doc>    {
Doc>        _myFactory = myFactory;
Doc>    }


Doc>    public IEnumerable<IMyClass> CalculateSomething()
Doc>    {
Doc>        return Enumerable.Range(1,100).Select( i => _myFactory.CreateSomething(i));
Doc>    }
Doc>}
Doc>


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

public class MyFactory : IMyFactory
{
    IContainer container;

    public MyFactory(IContainer container)
    {
    this.container = container;
    }
     
    IMyClass CalculateSomething(int i)
    {
         return container.Resolve<IMyClass>(new TypedParameter(type(int), i);
    }
}


т.е. пока не ясно как избавиться от container, т.к. конструктор типа имплементирующего IMyClass может принимать массу аргументов которые хотелось бы брать из контейнера а не передавать явно.
Re[2]: как ресолвить не передавая ссылки на контейнер ( DI )
Здравствуйте, Doc, Вы писали:

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


O>>Как такие сценарии правильно строятся без передачи и хранения ссылок на контейнеры ?


Doc>Задача состоит в создании экземпляра класса так ведь? А подобную задачу решат шаблон Factory.

Doc>
Doc>public class A 
Doc>{
Doc>    private IMyFactory _myFactory;
    
Doc>    public A (IMyFactory myFactory)
Doc>    {
Doc>        _myFactory = myFactory;
Doc>    }


Doc>    public IEnumerable<IMyClass> CalculateSomething()
Doc>    {
Doc>        return Enumerable.Range(1,100).Select( i => _myFactory.CreateSomething(i));
Doc>    }
Doc>}
Doc>


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

public class MyFactory : IMyFactory
{
    IContainer container;

    public MyFactory(IContainer container)
    {
    this.container = container;
    }
     
    IMyClass CreateSomething(int i)
    {
       return container.Resolve<IMyClass>(new TypedParameter(type(int), i);
    }
}


т.е. пока не ясно как избавиться от container, т.к. конструктор типа имплементирующего IMyClass может принимать массу аргументов которые хотелось бы брать из контейнера а не передавать явно.