Когда следует использовать [сборка: InternalsVisibleTo()]?

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

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

Ответы

Ответ 1

Сценарий может заключаться в том, что у вас есть разделение логики между сборками (такими как внутренние объекты данных и логический уровень). Вы не хотите показывать классы своим пользователям, но вы все равно хотите использовать объекты в своих собственных сборках.

Я думаю, что это не очень распространенный сценарий, я почти никогда не использую InternalsVisibleTo в контексте не единичных тестов.

Ответ 2

Этот сценарий аналогичен сценарию Elisha's, но предназначен для обеспечения правильного использования вашей модели домена в Доменный дизайн.

Скажем, у вас есть сборка MyProject.Core, которая содержит все ваши модели домена. Если вы не хотите, чтобы другие люди напрямую создавали экземпляры ваших моделей домена, вы можете сделать конструкторы internal.

Другая сборка под названием MyProject.Services содержит службы домена, которые специализируются на создании допустимых объектов домена. Эта сборка будет иметь ссылку на MyProject.Core. Атрибут InternalsVisibleTo используется для предоставления доступа к узлу службы доступа к конструкторам internal.

Другим преимуществом ссылки от MyProject.Services до MyProject.Core является то, что он запрещает объектам домена сохранять ссылки на службы домена, что считается хорошей практикой DDD.

Примечание. Я никогда не применял вышеуказанный сценарий на практике, поэтому он может быть не совсем точным на уровне DDD. Но это использование InternalsVisibleTo, о котором я мог думать, что не связано с unit test.

Ответ 3

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

Кроме этого, я никогда не использовал и не нуждался в нем.