Как я могу установить дополнительные свойства, если объект сохраняется из базы данных с помощью NHibernate? - PullRequest
0 голосов
/ 18 сентября 2010

Я создаю приложение, которое создает каталог файлов. Данные каталога будут храниться в базе данных через NHibernate, но фактические файлы просто хранятся в файловой системе. Я абстрагировал интерфейс с файловой системой в интерфейс с именем IFileSystemAdaptor.

Когда объект сохраняется из базы данных, мне нужно установить его свойство IFileSystemAdaptor FileSystemAdaptor, чтобы его методы и свойства могли обращаться к файловой системе.

Например, пользователь может позже вызвать AddAttachment(string filename, Stream data) для сохраняемого объекта. Это заставит его записать поток в указанное имя файла через его IFileSystemAdaptor и добавить новое имя файла в его свойство AttachmenFileNames, которое впоследствии будет сохранено в базе данных.

Где можно вставить код для установки свойства FileSystemAdaptor для объектов, которые сохраняются в базе данных? Должен ли я добавить слой абстракции между Session / SessionFactory, который устанавливает свойство FileSystemAdaptor перед возвратом объектов? Или я каким-то образом могу внедрить эту функцию в SessionFactory, чтобы она возвращала объекты с уже установленным FileSystemAdaptor?

Ответы [ 3 ]

1 голос
/ 18 сентября 2010

Вы можете написать IPostLoadEventListener для настройки вашего свойства после получения объекта из базы данных.Или используйте пользовательский поставщик байт-кода , чтобы внедрить вашу сущность с помощью реализации IFileSystemAdaptor.

0 голосов
/ 18 сентября 2010

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

0 голосов
/ 18 сентября 2010

Я бы отнесся к этому как к проблеме инфраструктуры. Ваша бизнес-логика может взаимодействовать с IFileSystemAdaptor, и вы можете использовать Inversion of Control для передачи конкретных экземпляров FileSystemAdaptor в вашу бизнес-логику (отображение между интерфейсом и конкретным экземпляром будет определено в web.config или app.config). Это позволит вам создавать модульные тесты, которые передают фиктивный экземпляр FileSystemAdaptor, чтобы ваша бизнес-логика не зависела от файловой системы.

Я бы предложил реализовать этот класс в слое / проекте, предназначенном для проблем инфраструктуры, или, возможно, в слое «Службы приложений», предназначенном для логики приложения, которая не обязательно является бизнес-логикой.

...