Пометить только один внутренний класс как видимый для других сборок

Я знаю о существовании InternalsVisibleTo Атрибут, делающий все внутренние классы видимыми для внешних сборок.

В моем случае у меня есть проект Utilities, в котором все классы должны быть видны только одной конкретной сборке. Все классы, кроме одного, содержащие методы расширения, которые должны быть видны всем остальным сборкам в решении, а не внешним проектам.

Как лучше всего достичь этого результата?


person simoneL    schedule 24.07.2014    source источник


Ответы (2)


Что ж, один из способов добиться этого, если вы используете IDE, способную на это, — поделиться файлом с классом с помощью методов расширения. Таким образом, если вы пометите его как внутренний, а все остальные классы как общедоступные, вы можете иметь доступ к методам расширения, но он не является общедоступным. Кроме того, когда вы редактируете класс метода расширения, это будет отражено во всех ваших сборках в вашем решении. В Visual Studio это можно сделать, щелкнув правой кнопкой мыши свой проект и выбрав «Добавить» -> «Добавить существующий элемент»:

введите здесь описание изображения

Затем найдите свой файл и выберите Добавить как ссылку:

введите здесь описание изображения

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

person Savvas Kleanthous    schedule 24.07.2014
comment
Действительно? Запах кода? Возможно, я неправильно понял цель сборки друзей. Я хочу поделиться своим кодом только с другими сборками решения. Я хочу заблокировать кого-то другого из другого проекта, чтобы он просто взял мой код и использовал его для своей работы. - person simoneL; 24.07.2014
comment
@simoneL Причина, по которой это запах кода, заключается в том, что уже есть некоторые конструкции для видимости. Если вам нужно предоставить какую-то услугу, то она должна быть общедоступной. Если нет, то он должен быть внутренним. - person Savvas Kleanthous; 24.07.2014
comment
@simoneL Если вам нужно ограничить доступ к предоставляемым службам, используйте интерфейсы, некоторые общедоступные, а некоторые внутренние, и пусть ваши классы реализуют эти интерфейсы, пока ваши классы являются внутренними. Когда ссылка на этот класс требуется внешней сборкой, иск фабрики и возврат в качестве одного из интерфейсов. - person Savvas Kleanthous; 24.07.2014
comment
А если я хочу полностью скрыть свои классы от внешних сборок, что мне делать? - person simoneL; 24.07.2014
comment
@simoneL Послушайте, если вы хотите, чтобы они были доступны, но только внутри ваших собственных сборок, то обязательно используйте InternalsVisibleTo! Тот факт, что это запах кода, не означает, что его нельзя использовать. Это означает, что вы должны тщательно обдумать использование и рассмотреть другие решения, если они существуют. Опять же, общественное и внутреннее существуют не просто так... - person Savvas Kleanthous; 24.07.2014
comment
@simoneL Кстати, мое решение (с общими файлами) точно решает ваш вопрос, и это практика, широко используемая в решениях Xamarin. Пожалуйста, рассмотрите возможность пометить мой ответ как принятый. - person Savvas Kleanthous; 24.07.2014

Разделите их. Поместите общий класс в его собственную сборку.

Невозможно указать определенные классы как «внутренние, видимые для».

person Roy Dictus    schedule 24.07.2014
comment
Возможно, я недостаточно ясно выразился в своем вопросе. Ни один из классов в проекте Utils не является общедоступным, все они являются внутренними. Отличие в том, что все они должны использоваться только в другой сборке решения, но класс Extensions должен быть доступен во всех остальных сборках, но не во внешних. - person simoneL; 24.07.2014
comment
Я перефразирую свой ответ и изменю общедоступный на общий. В остальном ответ остается прежним... - person Roy Dictus; 24.07.2014