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

На странице 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)


arrow_upward
2
arrow_downward

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

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

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