IOC/DI: Является ли регистрация конкретного типа запахом кода?
Я немного боролся с этим в моем текущем проекте. Я сталкивался с некоторыми случаями, когда у меня есть конкретный тип, который не требует (и не нуждается) в реализации какого-либо конкретного интерфейса. Иногда я хочу, чтобы разрешение происходило через контейнер, потому что тип зарегистрирован в жизненном цикле singleon; иногда тип имеет параметры конструктора, которые являются частью более крупного графа объектов или сами регистрируются в одноэлементных жизненных циклах.
Мне всегда немного странно, когда я набираю код вроде:
Container.RegisterType<MyConcreteType, MyConcreteType>();
Любые мысли о том, является ли это запахом кода или нарушает лучшие практики для использования контейнера IOC?
1 ответ
Контейнер IoC является контейнером инверсии управления, а не контейнером абстракции или интерфейсом к контейнеру реализации. Вполне законно сопоставлять классы самим себе, и контейнер должен управлять их временем жизни.
Если ваш дизайн не требует использования интерфейсов, не форсируйте их. Это будет запахом дизайна, а именно ненужной сложностью.
Я думаю о контейнерах IoC как о фабриках по производству стероидов. Не каждая фабрика - это абстрактная фабрика (например, синглтоны). Следовательно, не каждая регистрация в контейнере IoC должна быть реализацией отображения абстракции.