Я пытаюсь привести имена своих сборок в соответствие с их пространствами имен и в качестве руководства использую саму .NET Framework. Я твердо верю, что работа со структурой пространства имен, которая управляет структурой папок, делает базу кода более удобной для сопровождения.
Например, у меня есть провайдер кэширования, который является частью глобальной среды разработки, которую мы используем. Он живет в пространстве имен чего-то похожего на:
[Компания] .Core.Data.Caching
У меня есть другие функции, связанные с данными, которые также логически попадают под функцию Data, поэтому в кэшировании есть такие же братья, как адаптеры, конвертеры и генераторы. Итак, давайте предположим, что у нас есть следующие пространства имен:
[Компания] .Core.Data.Adapters
[Компания] .Core.Data.Converters
[Компания] .Core.Data.Caching
[Компания] .Core.Data.Generators
Эти связанные пространства имен находятся в сборке под названием [Company] .Core.Data, которая также является именем проекта. Найти вещи в решении становится очень просто, следуя этой структуре. Говоря о структуре, теперь мы вернемся к тому, как они хранятся на диске.
Имя проекта - это имя корневой папки. Предполагается, что моя папка управления исходным кодом, "C: \ Source Control" на моей локальной машине:
C: \ Source Control \ Core [Company] .Core.Data \
C: \ Source Control \ Core [Company] .Core.Data \ Adapters
C: \ Source Control \ Core [Company] .Core.Data \ Caching
C: \ Source Control \ Core [Company] .Core.Data \ Converters
C: \ Source Control \ Core [Company] .Core.Data \ Generators
Итак, как иерархия это выглядит примерно так:
[Решение]
- [Компания] .Core.Data
---- [Адаптеры]
------ (Файлы адаптеров)
---- [Кеширование]
------ (Кэширование файлов)
---- [Конвертеры]
------ (Конвертеры файлов)
Я ставлю все проекты на одном уровне и меняю подпространства имен папками. Таким образом, пространства имен и физические структуры легко согласовать. Трудная часть - найти баланс. Вы не хотите иметь большое количество меньших сборок, поэтому я обычно группирую их на более высоком уровне и, в конечном итоге, делаю рефакторинг, когда он либо становится слишком большим, либо если подпространства имен меняются чаще, чем другие части .
Я занимаюсь этим уже много лет, и это очень удобно не только для меня, но и для моих разработчиков.
Что касается вашего вопроса EventArgs, я согласен с мнением, что я обычно делаю один класс на файл, но сделаю исключение для размещения класса EventArgs с другим классом, если он используется в единственном числе. Для многократного использования я помещаю их в самую высокую логическую точку в сборке, что позволяет структуре пространства имен связывать мою область видимости.