Как скрыть данные от всех классов, кроме одного?

Я пытаюсь исправить недостаток дизайна, с которым я недавно столкнулся в некоторых наших программах, не переписывая все это целиком. Существует .exe, в котором есть поток прослушивателя сообщений, который получает данные с какого-то сервера, а затем записывает их в класс в отдельной DLL (назовем его StaticDataClass), в котором хранятся все полученные данные (в основном статические). извлекается из базы данных при запуске). Этот класс также предоставляет методы, которые другие классы могут использовать для извлечения данных. Проблема в том, что все методы store (set) общедоступны, поэтому любой другой класс может перезаписать эти данные и сломать все приложение. Как мне лучше защитить данные (сделать методы установки/сохранения невидимыми) для всех объектов, кроме тех, которые содержатся в самом исполняемом файле?

Прямо сейчас я играю с интерфейсом, который определяет только общедоступные геттеры, а затем реализует этот интерфейс в одноэлементном классе, а затем свойство Instance возвращает тип интерфейса, поэтому они смогут использовать только методы получения, объявленные в интерфейсе. . Но когда исполняемый файл запускается, он каким-то образом получает фактическую ссылку на объект StaticDataClass, а не на тип интерфейса, поэтому он также сможет вызывать методы сохранения/установки.

Это не совсем полное доказательство, но оно не дает некоторым разработчикам, не знакомым с системой, подумать, что можно использовать эти общедоступные методы хранения, потому что интеллектуальный тип Visual Studio делает их видимыми при написании кода. Вместо этого им придется попытаться сломать его, приведя объект к типу, содержащему методы хранилища.

Есть ли более чистый способ сделать это?


person alexD    schedule 22.10.2009    source источник


Ответы (2)


Вы можете сделать методы set внутренними и использовать InternalsVisibleToAttribute для предоставления доступа к предпочтительному исполняемому файлу.

person itowlson    schedule 22.10.2009
comment
Похоже, у этого есть потенциал, я попробую. Спасибо. - person alexD; 23.10.2009
comment
Похоже, это работает... это проще, чем любое решение, на которое я надеялся! - person alexD; 23.10.2009

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

person FinnNk    schedule 22.10.2009