Можете ли вы объяснить, что в основном означает «прокси» NHibernate? - PullRequest
3 голосов
/ 23 июня 2011

Не могли бы вы дать простое определение «прокси» NHibernate, пожалуйста.

В качестве примера приведем цитату из книги Мэннинга Ниберната в книге действий:

'Для или ассоциация, ленивая загрузка возможна только если сопоставление связанного класса включает проксирование . '

Ответы [ 2 ]

2 голосов
/ 23 июня 2011

Когда у вас есть ленивая ассоциация, NHibernate должен знать, когда код указывает на свойство, указывающее на ассоциацию, чтобы попасть в базу данных и извлечь нужную сущность. Это делается путем «проксирования» вашего класса, что означает наследование от вашего класса и переопределение получения и установки свойства. По этой причине у класса сущностей должно быть открытое свойство virtual, поэтому они могут быть перегружены в создаваемом производном (прокси) классе. Прокси создается автоматически фабрикой прокси, указанной в конфигурации.

2 голосов
/ 23 июня 2011

Это означает, что он создаст класс, который наследует вашу исходную сущность, и переопределит фактическое свойство, которое будет представлять связанный класс.

Таким образом, он может реализовать логику, которая будет извлекать данные из БД вдля достижения лени, вместо того, чтобы всегда иметь эти данные доступными.

Для коллекций это реализовано в версиях ISet, IList и т. д. NHibernate и т. д. Это относится только ко многим к одному или одному к-отношения.

Пример:

public class YourEntity {
    public virtual OtherEntity Entity { get; set; }
}

public class DynamicProxyEntity : YourEntity {
    private OtherEntity entity;

    public override OtherEntity Entity {
        get { return entity = LoadFromDb(); }
        set { this.entity = value; }
    }
}

Это очень упрощенная версия, надеюсь, она даст вам представление о том, как это работает.Это, конечно, может привести к проблемам в вашем приложении, потому что у вас не будет экземпляра вашего фактического типа Entity, но производного.Если вы украсили свои классы атрибутами и тому подобным, они могут быть не определены (в зависимости от вашего кода).Кроме того, проверка типов и т. д. может быть нарушена, если вы не будете осторожны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...