Недавно я просматривал некоторые графы зависимостей для своего основного личного проекта и заметил, что у меня есть взаимозависимость между объектами во вложенных пространствах имен. Например, у меня в MyNamespace.Foo
был объект, который реализовал универсальный интерфейс в MyNamespace.Foo.Interfaces
с этим объектом в качестве универсального параметра в интерфейсе.
namespace MyNamespace.Foo
{
internal class Foo : MyNamespace.Foo.Interfaces.IFoo<Foo>
{ }
}
В этом случае. инструмент анализа зависимостей (бета-версия VS2010) обоснованно рассматривает универсальное «создание экземпляров» (для обсуждения я знаю, что это не c ++) интерфейса как члена пространства имен Interfaces, которое затем зависит от его родительского пространства имен.
После некоторых размышлений с моей стороны я более или менее пришел к выводу, что мой существующий дизайн, в моем конкретном случае, является запахом кода. Я должен объединить пространство имен Interfaces
с родительским пространством имен Foo. (Глупо требовать от клиентов развертывания дополнительного слоя в пространстве имен интерфейсов, если я хочу, чтобы они использовали Foo
через IFoo
.) Однако верно ли это в общем случае?
Как должны управляться зависимости между пространствами имен? Должны ли «более широкие» пространства имен (например, MyNamespace.Foo
обычно зависеть от «более узких» пространств имен (например, MyNamespace.Foo.Interfaces
), или более узкие пространства имен зависят от более широких?