Re[5]: как ресолвить не передавая ссылки на контейнер ( DI )
От: Doc Россия http://andrey.moveax.ru
Дата: 19.05.18 05:52
Оценка: 4 (1)
Здравствуйте, okon, Вы писали:

O>Вот так не хотелось бы делать, т.к. жестко задается имплементация Foo, Bar и сложно для подмены для тех же тестов.


Так и не надо. Фабрика знает конкретные типы (тип) и создает только какую-то свою группу объектов (или один объект). Все они связаны целью, логически и т.д.

Все что надо для создания этой группы — зависимости уже фабрики. И знать эти типы фабрика не должна. Т.е.

public class MyFabric : IMyFabric 
{
    public MyFabric (IFoo foo, IBar bar) { … }

    public ISomething CreateSomething (int i)
    {
         return new Something (i, foo, bar);
         // или например
         // return new Something (foo(i), bar);
    }
}



PS: Кстати, service locator IMHO не всегда антипаттерн. В некоторых случаях он вполне применим. Но, наверное, это тема для отдельного разговора.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.