Я использую Unity для динамического разрешения типов для подключаемой архитектуры. Я также использую перехват для проверки бизнес-правил через АОП (используя ValidationAspects). Наконец, я использую NHibernate в качестве ORM для сохранения объектов домена.
Для работы АОП мы используем VirtualMethodInterceptor, так как перехват интерфейса не работает с NHibernate. У меня есть фасад над ISession, который обрабатывает приведение между интерфейсными и реальными типами для операций репозитория.
Чтобы убедиться, что все объекты в графе, полученные через NHibernate, правильно проксируются для АОП, я сделал реализацию NH IInterceptor и переопределил метод Instantiate(), чтобы я мог предоставлять NH созданные объекты, а не вызывать new(). Затем я использую Container.Resolve(), чтобы вернуть проксированные объекты с введенной проверкой, и возвращаю их в NH для заполнения. Это работает нормально.
Проблема возникает, когда происходит сброс сеанса. NHibernate расстраивается, потому что объекты, которые он видит в графе, относятся к типу прокси, а не к реальному типу. То, как мы отображаем (все через свойства, все виртуальные), NH должен иметь возможность получать все необходимые значения через прокси, если бы я мог переопределить проверку типов.
Что мне нужно знать, так это: учитывая прозрачно проксируемый объект, созданный Unity с включенным перехватом, есть ли а) какой-либо способ получить прямую ссылку на «реальный» экземпляр, который он проксирует, или б) переопределить NH и сказать ему обработать объекты прокси-типа, как если бы они были известного сопоставленного типа, динамически во время выполнения?