При внедрении зависимости с использованием фабрик, как обрабатывать случаи, когда мы не знаем тип зависимости во время создания объекта? - PullRequest
0 голосов
/ 08 декабря 2011

Я сталкивался с тем фактом, что использование нового ключевого слова приводит к трудностям при тестировании кода. Похоже, что решением этой проблемы является передача зависимостей в конструкторе и создание экземпляров объектов только на фабриках. Но что, если мы не знаем все зависимости (или типы зависимостей) во время создания объекта? Как обращаться с такими случаями?

Например, скажем, у нас есть дерево, которое может иметь разные типы узлов. После создания узла мы не знаем тип его потомков.

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

Если передаваемая вещь не может быть определена в момент создания, вам нужна какая-то форма Abstract Factory , хотя обычно полезно провести грань между типами служб и значений, которые не должныесть обратные ссылки на Сервисы.

Почему я отвечаю в общих чертах?Поскольку вы спрашиваете в общих чертах - приведите пример чего-то более конкретного и контекстуального, к которому вы ищете хороший подход, если вы действительно хотите получить ответ, который будет полезен.

Вы не указалисмотрите ли вы на Принцип инверсии зависимостей или DI Frameworks или Управление зависимостями в библиотеках , которые имеют столько общего и много чего можно выделить.


Я подозреваю,(даже если вы, кажется, не трогаете теги .NET), как рекомендует @TrueWill, превосходная книга Inpendency Injection в .NET поможет вам понять все тонкости (независимо от языка или платформывы используете - передняя часть книги - это просто довольно независимые от технологии шаблоны - до такой степени, что это возможно, учитывая, что превосходные примеры имеют реалистичные уровни сложности).

1 голос
/ 08 декабря 2011

Внедрение в конструктор - только одна из различных возможностей.

Вы можете зарегистрировать ваши типы в контейнере IoC (Inversion of Control) и разрешить их при необходимости.

Пример .Net с блоком приложений Unity от Microsoft:

// When starting your application, you register your types:

var myContainer = new UnityContainer();
var logger = new Logger();
myContainer.RegisterInstance<ILogger>(logger);

// Later, when you need them, you can resolve them in your code:

var logger = myContainer.Resolve<ILogger>();
...