В предыдущей статье, для того, чтобы решить уровень доступа членства, я использовал адаптер объекта, так что клиент не может легко изменять свойства объекта. Пользователь замечает, что моя практика по кругу, в самом деле, этот метод не может помешать клиенту намеренно, чтобы изменить свойства объекта, но в определенной степени, играл защитный эффект: по крайней мере, уменьшить вероятность неправильного использования секс.
Сегодня, на самом деле, мы обнаружили, что тот же эффект может быть достигнут с System.Runtime.CompilerServices.InternalsVisibleToAttribute этой функции. Следующие шаги.
- Это предположение ExposedSetter.Library SourcedAggregationRoot библиотека классов содержит атрибут класса, имеющий внутренние сеттер. Во-первых, ExposedSetter.Library для цифровых подписей. Щелкните правой кнопкой мыши на проекте ExposedSetter.Library выберите «Свойства». Выберите «Подписать сборку» вариант в разделе страницы «подписывания», а затем указать ключа строгого имени файла. SourcedAggregationRoot код и подпись устанавливается следующим ExposedSetter.Library
Класс общественного SourcedAggregationRoot : IVersionControllable
{
частный длинный вариант;
частный длинный филиал;
#region IVersionControllable Пользователи
общественности долго версия
{
получить { вернуть эту .version; }
внутреннее множество { это .version = значение ; }
}
общественности давно Branch
{
получить { вернуть эту .branch; }
внутреннее множество { это .branch = значение ; }
}
#endregion
общественного переопределение строки ToString ()
{
возвращенная строка .Format ( "Version = {0}, Отделение = {1}" ,
версия, филиал);
}
}
- Создать новую библиотеку классов, чтобы вызвать внутреннюю сеттер ExposedSetter.Library собственности в SourcedAggregationRoot из. Для удобства описания мы этот класс библиотека имени ExposedSetter.Library2. В этой библиотеке классов, чтобы добавить ссылку на ExposedSetter.Library, а просто написать тест класса, вызовите внутренний сеттер SourcedAggregationRoot свойства непосредственно в классе, чтобы установить значение свойства.
общественный класс Class1
{
общественного SourcedAggregationRoot Test ()
{
SourcedAggregationRoot сар = новый SourcedAggregationRoot ();
sar.Branch = 125 ;
вернуться сар;
}
}
Аналогично, для ExposedSetter.Library2 делать цифровые подписи (это важно!)
- Запустите командную строку из Visual Studio, используйте Sn.exe получить открытый ключ ExposedSetter.Library2 из (открытого ключа) Примечание: Это открытый ключ, а не ключевой знак общественного
- Откройте ExposedSetter.Library файл AssemblyInfo.cs, чтобы добавить InternalsVisibleToAttribute:
[ Сборка : InternalsVisibleTo ( "ExposedSetter.Library2, ОткрытыйКлюч = 0024000004800000940000000602000000240" +
"000525341310004000001000100bbccb249a2e7a1" +
"7cbddf86e24532777568cb13c2ea7643b61cf60367068f2b9ca785dca303c49f015823e4eaa17b" +
"50ed60ac47563dc8d8771358f10c3dc41f288530cfa350e6a2a24781dedeb8ec4138f93e76c537" +
"bce6c5aa7b25858fa90d6ef5c6ea613b1b49e6e287f9ebb7f990cfa0ce17fbfe1c338e95e88c14" +
"81f9598f" )]
Обратите внимание, что параметр InternalsVisibleToAttribute указывает разрешить доступ к его внутреннему имени сборки член и открытых ключей данных. В этой версии нельзя установить сборку и другую информацию, или компилятор будет идти до конца.
- Обобщение решения
Таким образом, немного похож на друг C ++. По сравнению с решениями объекта адаптера я уже упоминал выше, этот подход более профессионально, в конце концов, может быть непосредственно поддерживается .NET Framework, но и является более безопасным, он может явно указать, какой узел может получить доступ к остальной части Вы не можете получить доступ. Но этот подход также имеет свои недостатки: Предположим, у меня есть будущее сборки ExposedSetter.Library хотите использовать внутренний элемент, мне нужно изменить код ExposedSetter.Library для того, чтобы добавить InteralsVisibleToAttribute характеристики.
Адрес репринт: http://www.cnblogs.com/daxnet/archive/2010/08/12/1797782.html
Воспроизводится в: https: //www.cnblogs.com/jvstudio/archive/2010/08/12/1797812.html