Создайте интерфейс IReadOnlyPerson, который предоставляет доступ только для доступа. Попросите человека реализовать IReadOnlyPerson. Сохраните ссылку на Персона в вашем контроллере. Дайте другим клиентам только версию только для чтения.
Это защитит от ошибок, но не от мошенничества, как с большинством функций OO. Клиенты могут во время выполнения привести к Person, если они узнают (или подозревают), что Person реализован IReadOnlyPerson.
Обновление, за комментарий:
Интерфейс только для чтения может также предоставлять делегат события, как и любой другой объект. Идиома, обычно используемая в C #, не препятствует тому, чтобы клиенты возились со списком слушателей, но соглашение состоит только в том, чтобы добавить слушателей, поэтому этого должно быть достаточно. Внутри любого метода доступа или функции с побочными эффектами, изменяющими состояние, просто вызовите делегат события с защитой для нулевого (без слушателей) случая.