Почему свойства навигации должны быть общедоступными для создания прокси?

На странице http://msdn.microsoft.com/en-us/library/dd468057.aspx Я читал, что все свойства навигации, для которых я хотел бы иметь прокси-сервер отслеживания изменений, должны быть public и virtual. Насколько я понимаю, CLR динамически создает подклассы моих POCO и повторно реализует свойства для обеспечения запрошенного поведения.

Для этого я понимаю, что свойство должно быть virtual и что оно должно иметь доступность protected или выше. Однако, если я хочу использовать их для удобства в сборке, но не хочу раскрывать их, я предпочитаю, чтобы они не были public. Что приводит меня к двум вопросам.

  1. (насколько я понимаю, что происходит), почему среда выполнения требует, чтобы свойства были public, а не protected или internal?

  2. (для моей реальной ситуации) существуют ли какие-либо обходные пути, чтобы скрыть свойство навигации, но при этом сохранить поведение отслеживания изменений?


person Martijn    schedule 18.06.2012    source источник


Ответы (1)


Свойства должны быть общедоступными (и виртуальными) ИЛИ защищенными (и виртуальными) для работы прокси.

Прокси-серверы не определены в вашей сборке, поэтому внутренние не будут работать.

Private не будет работать по понятным причинам (прокси наследуются от ваших классов).

person Danny Varod    schedule 18.06.2012
comment
Я мог бы поклясться, что пытался защитить, и это не сработало. Я вернусь к этому после того, как попробую еще раз - person Martijn; 18.06.2012
comment
Я пробовал это с генератором POCO. Это особенно полезно для сборщиков коллекции. - person Danny Varod; 18.06.2012
comment
Конкретная причина, по которой это не работает, заключается в том, что вы не можете переопределить внутреннее виртуальное свойство вне сборки, как утверждает Дэнни. Вы можете добиться желаемого результата, пометив свою собственность как внутреннюю. - person Evan Machusak; 20.12.2013
comment
Пожалуйста, добавьте, что вам нужно сначала настроить защищенную навигацию. Например, HasMany(t => t.ProtectedVirtualNavigationCollection).WithRequred(t => t.Source) - person verbedr; 04.12.2019