Я понимаю, что атрибут InternalVisibleTo используется для представления типов и методов с внутренним модификатором доступа к указанному блоку. Я только когда-либо использовал это для представления внутренних методов к отдельному блоку, содержащему комплект модульных тестов.
Я изо всех сил пытаюсь думать о другом сценарии, когда это должно использоваться. Этот атрибут был представлен конкретно для помощи поблочному тестированию или был там другой причиной?
Сценарий может заключаться в том, что у вас есть разделение логики между сборками (например, внутренние объекты данных и логический уровень). Вы не хотите предоставлять классы своим пользователям, но вы все равно хотите использовать объекты в своих собственных сборках.
Я думаю, что это не очень распространенный сценарий, я почти никогда не использую InternalsVisibleTo
в контексте не модульных тестов.
Помимо тестирования, единственный другой сценарий, который я когда-либо использовал атрибут InternalsVisibleTo
, был при создании сборок сериализации.
Кроме этого, я никогда не использовал и не нуждался в этом.
Этот сценарий похож на сценарий Елисея, но направлен на обеспечение правильного использования вашей доменной модели в Domain-driven design.
Допустим, у вас есть сборка MyProject.Core
, которая содержит все ваши доменные модели. Если вы не хотите, чтобы другие люди непосредственно создавали экземпляры ваших доменных моделей, вы можете сделать конструкторы внутренними
.
Другая сборка, называемая MyProject.Services
, содержит доменные службы, которые специализируются на создании действительных доменных объектов. Эта сборка будет иметь ссылку на MyProject.Core
. Атрибут InternalsVisibleTo
используется для предоставления сборке доменной службы доступа к внутренним
конструкторам.
Другим преимуществом ссылки с MyProject.Services
на MyProject.Core
является то, что она запрещает объектам домена сохранять любые ссылки на доменные службы, что считается еще одной хорошей практикой DDD.
Примечание: Я никогда не применял вышеприведенный сценарий на практике, поэтому он может быть не совсем точным на уровне DDD. Но это использование InternalsVisibleTo
, которое я смог придумать и которое не связано с модульными тестами.