Лучшие практики Unity с классами .NET Framework - PullRequest
2 голосов
/ 14 мая 2009

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

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

Ответы [ 4 ]

0 голосов
/ 14 мая 2009

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

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

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

0 голосов
/ 14 мая 2009

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

0 голосов
/ 14 мая 2009

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

Далее вы можете взглянуть на учебник по TDD, используя Rhino Mocks и SystemWrapper . Вы можете увидеть там использование DI; однако, пример там не использует IoC.

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

0 голосов
/ 14 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...