Подтвердить что ты не робот

С# Пространства имен и сборки Лучшие практики

С#: существуют ли какие-либо рекомендации, рекомендации по разделению решения на пространства имен и сборки? Должны ли имена пространств обычно быть вложенными, с наименьшим уровнем и фундаментальными классами в пространстве имен верхнего уровня? Должно ли существовать одно пространство имен для одной сборки? Есть ли у них какие-либо проблемы с наличием нескольких сборок в одном пространстве имен или нескольких пространств имен в одной сборке. Существуют ли какие-либо компиляции времени/времени выполнения для нескольких сборок или очень больших сборок?

4b9b3361

Ответ 1

С#: существуют ли какие-либо рекомендации, рекомендации по разделению решения на пространства имен и сборки?

Для руководств для пространств имен ознакомьтесь с рекомендациями по разработке структуры.

Для сборок: сборка по определению является самой маленькой независимо версией единицы самоописывающей функции shippable в .NET. Существуют ли части вашего программного обеспечения, которые вы собираетесь отправлять или изменять независимо друг от друга? Затем они должны быть в разных сборках.

Если пространства имен обычно вложены, с наименьшим уровнем и фундаментальными классами в пространстве имен верхнего уровня?

Не обязательно, нет.

Пространства имен должны быть спроектированы таким образом, чтобы пользователям было легко обнаружить и понять типы, содержащиеся в этих пространствах имен. Возможно, вы должны спросить своих пользователей, что они думают.

Должно ли быть одно пространство имен для одной сборки?

Не обязательно, нет.

Есть ли у них какие-либо проблемы с наличием нескольких сборок в одном пространстве имен или нескольких пространств имен в одной сборке.

Не особенно, нет.

Существуют ли какие-либо компиляции времени/времени выполнения для нескольких сборок или очень больших сборок?

Не то, чтобы я знал.

Ответ 2

Чтобы следить за тем, что сказал Эрик Липперт:

Имена сборки

Традиционно почти весь код в пространстве имен живет в одном пространстве имен и подпространствах с узлом, названным в честь пространства имен.

Например, если мне была предоставлена ​​сборка с именем файла Contoso.PartnerPortal.Services.dll, сокращенное имя сборки традиционно было бы Contoso.PartnerPortal.Services, и я ожидал бы, что основная часть кода будет жить в Contoso.PartnerPortal.Services пространство имен (и пространства имен).

Однако не все классы в пространстве имен Contoso.PartnerPortal.Services обязательно будут находиться в сборке Contoso.PartnerPortal.Services.dll. Если существует сборка Contoso.PartnerPortal.dll, она может также иметь некоторые классы в пространстве имен Contoso.PartnerPortal.Services.

Одно из них - использование интерфейсов. Если интерфейсы живут в Contoso.PartnerPortal.dll, тогда код в этой сборке может использовать интерфейс без ссылки на Contoso.PartnerPortal.Services.dll. Это важно, так как Contoso.PartnerPortal.Services.dll(который будет реализовывать интерфейсы), скорее всего, придется ссылаться на Contoso.PartnerPortal.dll и ссылки на обратную сборку лучше избегать.

Число/размер сборок

Ассембли, которые чрезмерно велики, могут сделать компиляцию более длительной, чем необходимо. Это связано с тем, что компиляторы не имели поддержки для инкрементной компиляции в течение довольно длительного времени. Таким образом, весь модуль должен быть скомпилирован как единое целое. Поскольку многомодульные сборки не часто используются, это в основном подразумевает, что вы должны скомпилировать сразу всю сборку.

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

С другой стороны, имея более 600 сборок в одном приложении (я работаю над таким монстром в моей дневной работе), есть свой набор проблем. Например, функция теневой копии ASP.net имеет проблемы с производительностью, связанные с этим множеством сборок (помните, что это в дополнение к большому количеству сборок, созданных, когда ASP.net компилирует файлы aspx и ascx).

Ответ 3

Пространства имен - просто причудливый способ разделения имен классов для удобства пользователя. Таким образом, для использования пространств имен нет компиляции/времени выполнения или увеличения.

Разделение объектов на сборки будет влиять на время выполнения и время компиляции, также маловероятно, что вы не будете иметь большого количества сборок. Обратите внимание, что невозможно предсказать, что вы получаете прибыль или медленность без фактических измерений для вашего конкретного случая.

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