2009-05-14 3 views
2

Я только начинаю использовать любой набор инструментов DI/IoC и задаю очень простой вопрос. Я использую Unity, так как мы также будем использовать ряд блоков Enterprise Library во всем приложении.Рекомендации по использованию Unity с классами .NET Framework

Вопрос, который у меня есть, касается зависимостей от .NET-классов .NET. Например, в одном из классов, над которым я сейчас работаю, мне нужно создать классы DirectoryInfo. По моему мнению, одна из лучших практик в DI заключается в том, чтобы никогда не использовать «новое» ключевое слово - поскольку это вводит жесткую зависимость. Итак, как мне получить новый каталог DirectoryInfo? Добавить его как элемент в контейнер и иметь контейнер в зависимости от класса? Похоже, что это было бы импровизированным в реальной жизни, так как я бы закончил с контейнером, который был сконфигурирован буквально в тысячи классов инфраструктуры. Я бы счел, что это кошмар.

ответ

0

Как я вижу это, большинство классов в BCL (библиотека базового класса) являются классами utiity и, как правило, не имеют тонны других зависимостей, кроме графиков прямых вызовов.

DI предназначен для сглаживания графов вызовов и предотвращения много перекрестного разговора между классами. Как таковой, и тот факт, что вы ничего не можете сделать о хладнокровии BCL, вы можете просто принять их за то, что они есть, и использовать новые ...

Единственная причина, по которой вы не хотели бы хотите, для тестирования. Обычно вы не тестируете классы BCL, но вам может потребоваться заменить класс BCL на насмешку, чтобы он фактически не делал то, что делает класс, только притворяется, что делает это. И вы можете использовать такие вещи, как SystemWrapper, если это необходимо.

0

Я бы сказал, что это немного над инженерной. Я бы подумал, что путь к DirectoryInfo для создания должен быть передан или иметь какой-то класс репозитория конфигурации (или службы), переданный в том, что содержит (или дает вам способ получить) эти данные.

0

Я бы не зарегистрировал низкоуровневые классы, такие как DirectoryInfo, с контейнером - на самом деле не проблема использовать новые в некоторых местах вашего приложения, если это требование не «просачивается» на более высокий уровень классы. Таким образом, в этом примере, вероятно, имеет смысл создавать и использовать DirectoryInfo непосредственно в классе, но экземпляры этого класса должны быть инъецированы в их иждивенцы контейнером.

0

Сначала вы можете посмотреть, как SystemWrapper библиотеки. Он обертывает объект DirectoryInfo, чтобы вы могли его издеваться.

Далее вы можете посмотреть tutorial to TDD using Rhino Mocks and SystemWrapper. Вы можете видеть использование DI; однако в этом примере не используется ни один из IoC.

Надеюсь, это поможет.

Смежные вопросы