Когда следует использовать [сборка: 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
, я использовал при создании сборок сериализации.
Кроме этого, я никогда не использовал и не нуждался в нем.