IOC/DI: Является ли регистрация конкретного типа запахом кода?

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

Мне всегда немного странно, когда я набираю код вроде:

Container.RegisterType<MyConcreteType, MyConcreteType>();

Любые мысли о том, является ли это запахом кода или нарушает лучшие практики для использования контейнера IOC?

1 ответ

Решение

Контейнер IoC является контейнером инверсии управления, а не контейнером абстракции или интерфейсом к контейнеру реализации. Вполне законно сопоставлять классы самим себе, и контейнер должен управлять их временем жизни.

Если ваш дизайн не требует использования интерфейсов, не форсируйте их. Это будет запахом дизайна, а именно ненужной сложностью.

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

Другие вопросы по тегам