В C # (VS-2010) есть ли способ отменить сборку внешнего интерфейса, если используется определенный класс библиотеки?(Когда это нормально скомпилируется?) - PullRequest
3 голосов
/ 11 августа 2011

Я пишу библиотеку, в которой есть несколько классов, предназначенных для использования несколькими веб-интерфейсами (некоторые веб-интерфейсы используют одни и те же классы).Для каждого интерфейса я веду отредактированный вручную список классов (определенного пространства имен), которые он использует.Если веб-интерфейс попытается использовать класс, которого нет в этом списке, возникнут ошибки времени выполнения.Моя цель - переместить эти ошибки во время компиляции.

Если кому-то из вас интересно, это «сопоставленные» классы nhibernate.Я пытаюсь ограничить, какой веб-интерфейс может использовать то, что сокращает время раскрутки, и только для моего здравого смысла.В конечном итоге их будет сотни, и было бы очень хорошо, если бы где-нибудь был список, в котором говорилось бы, какие интерфейсы используют то, что я вынужден поддерживать.Кажется, я не могу сделать создание подклассов для каждого внешнего интерфейса, и я не могу использовать какие-либо классы-обертки ... просто примите это как данность, пожалуйста!

В идеале, я хочу, чтобы Visual Studioподчеркните красным те классы, которые оскорбляют, если кто-то решится их использовать, с приятной пользовательской ошибкой в ​​окне ошибок.Я также хочу, чтобы они ушли из окон IntelliSense.Можно ли настроить проект для выполнения этих задач?

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

Спасибо

Исаак

Ответы [ 3 ]

7 голосов
/ 11 августа 2011

Допустим, у вас есть набор классов F.Вы хотите, чтобы эти классы были видны только определенной сборке A.Затем вы разделяете эти классы в F на отдельную сборку и помечаете их как internal и устанавливаете для InternalsVisibleTo этой сборки значение true для этой конкретной сборки A.

Если вы попытаетесь использоватьэти классы из любой сборки A', которая не помечена как InternalsVisibleTo из сборки, содержащей F, вы получите ошибку времени компиляции, если попытаетесь использовать любой класс из F в A'.

Я также хочу, чтобы они ушли из окон IntelliSense.Можно ли настроить проект для выполнения этих задач?

Это происходит и с решением, которое я представил выше.Они являются внутренними для сборки, содержащей F, и не видны из любой сборки A', не помеченной как InternalsVisibleTo в сборке, содержащей F.

Однако, как правило, я считаю, что InternalsVisibleTo являетсяЗапах кода (не всегда, просто часто).

2 голосов
/ 11 августа 2011

Я думаю, вы захотите взглянуть на устаревший атрибут: http://msdn.microsoft.com/en-us/library/system.obsoleteattribute%28v=VS.100%29.aspx

Я полагаю, что вы можете установить IsError в true, и он выдаст ошибку во время сборки.

(но не положительно)

Что касается intellisense, вы можете использовать EditorBrowseableAttribute: http://msdn.microsoft.com/en-us/library/system.componentmodel.editorbrowsableattribute.aspx Или, по крайней мере, это то, что кажется украшенным, когда я добавляю ссылку на службу и не вижу членов.

2 голосов
/ 11 августа 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...