Как разделить понятия в пределах одного.Библиотека классов NET

#c# #.net #.net-assembly #class-library #conceptual

#c# #.net #.net-сборка #class-library #концептуальный

Вопрос:

Мне нравится, как концепции могут быть разделены, когда решение разбито на несколько библиотек классов. Например:

 System.IO.csproj,            Stream class
System.IO.Net.csproj,        NetworkStream class
System.IO.Filesystem.csproj, FileStream class
System.IO.Extensions.csproj, bunch of classes which builds on top of System.IO
  

Таким образом, я могу быть почти уверен, что Stream class ничего не знает о NetworkStream , как и должно быть. Когда кто-то пытается создать хак с участием NetworkStream внутри Stream класса, он получает ошибку компилятора, отлично!

Аналогичным образом, когда кто-то пытается добавить какой-то метод в Stream , который принимает в качестве аргумента что-то из расширений, он также получает ошибку компиляции, отлично! Иногда люди пытаются создать зависимость, которая никогда не должна существовать.

Есть ли способ аналогичным образом разделить понятия в одной библиотеке классов?Если не применять это, есть ли хотя бы способ протестировать это?

По моему опыту, лучше всего работает несколько библиотек классов, и легко управлять ссылками на них (это принудительное исполнение), но кажется непрактичным иметь большое количество библиотек классов. У меня часто есть некоторый код ядра, затем есть куча расширений, затем есть расширения 2-го уровня, Которые используют другие расширения и т.д. В идеальном мире каждое расширение было бы отделено от другого.

Тогда есть приложение или библиотека, которая использует функциональность, и с ее точки зрения, лучше всего, когда все является одной библиотекой классов.

Комментарии:

1. Вы можете объявить класс внутри другого класса в c #. Вы также можете использовать модификатор private в объявлении класса. Класс внутри класса плюс общедоступные модификаторы private будут делать то, о чем вы говорите. Также у вас могут быть разные пространства имен. Другой подход к пространствам имен заключается в использовании папок в вашем проекте и размещении классов в папках с именем класса, участвующим в папке.

2. Я не знаю способа разрешить общедоступный доступ из ссылающихся проектов, но запретить внутренний доступ из пространств имен того же проекта. Конечно, вы можете вручную проверить использование с помощью «найти все ссылки» на класс (обязательно запустите это в определении класса, а не в конструкторе, иначе вы найдете точки создания вместо использования)