1

Простой вопрос, если честно, не так прост.Свободно карты сборок/сущностей во время выполнения

Подумайте о проекте, таком как Wordpress. База Wordpress отличная, и разработчики создали ее для расширения с помощью виджетов или плагинов и т. Д.

Теперь подумайте о NHibernate, в частности, с Fluent Mappings.

Поместите их вместе, и у вас есть отличная и стабильная «базовая» система. Но как вы загружаете отображения, представленные на внешних собраниях? Я понимаю, что системе придется загружать сборки «на лету», используя рефлексию, но как вы сначала настраиваете nHibernate, Fluently, чтобы понять, что есть дополнительные объекты для загрузки из этих сборок? Как вы ссылаетесь на них?

Я знаю, что вы можете: t добавлять сопоставления во время выполнения после того, как выполнены конфигурации, ну, вы должны воссоздать SessionFactory. Вот почему я хочу загрузить все необходимые объекты во время выполнения.

Я также знаю, что это может быть достигнуто с помощью инъекции Dependancy Injection, но я не хочу идти по этому маршруту и ​​не хочу, чтобы с ним происходил экстремальный багаж.

Если простой старый файл конфигурации nHiberante можно изменить, а затем указать во время выполнения, чтобы отразить новые объекты, я могу только предположить, что должен быть способ сделать это свободно.

Кроме того, на основе ответов: вы делаете конфигурацию из базового проекта или узла DATA ACCESS?

Благодарим за помощь.

+0

«крайний багаж, который поставляется вместе с ним». Могу ли я спросить, к какому экстремальному багажу вы относитесь? Может быть, я могу помочь вам лучше понять контейнеры IoC. –

+0

Я, конечно, хотел бы их лучше понять. Большая часть документации там в лучшем случае разрежена и предназначена для гуру программного обеспечения, они просто не вернутся к основам или не обращают внимания на средний код, который необходим. Буду премного благодарен. У меня действительно был беспорядок с замком раньше, но мне потребовалось около двух дней, чтобы запустить его, так как документы были неполными, только чтобы найти, что я больше не могу использовать Касл с моим предполагаемым проектом. Я действительно понимаю, почему это очень полезно, но я боюсь, что некоторые проекты будут излишними, но если бы я понял это лучше, я бы подумал иначе. – Anthony

ответ

4

Вы можете передать объект конфигурации NHibernate в Fluently.Configure(). Таким образом, вы можете обновить конфигурацию. Вам нужно заново создать фабрику сеансов, когда вы это сделаете, как вы сказали.

Вы можете сканировать сборки в папку бен для сборок, содержащих беглые классы отображения (Assembly.Load, а затем проверить

Assembly.GetExportedTypes() 
     .Any(x => x.IsClass 
       && !x.IsAbstract 
       && typeof(IMappingProvider).IsAssignabledFrom(type)) 

или аналогичный) и добавить сборку. Когда все сборки проверяются, (повторно) создайте фабрику сеансов.

Я делаю что-то подобное в расширяемой структуре приложения, которую я написал (хотя я перешел с Fluent NHibernate на отображение NHibernate по коду, но принципы похожи).

+0

Можете ли вы объяснить, что вы подразумеваете под «NHibernate mapping by code»? Это что-то похожее на Fluent? – Anthony

+0

NHibernate 3.2 имеет встроенный способ сопоставления классов с использованием кода вместо XML/атрибутов и автоматической сопоставления классов по соглашению. Его назначение аналогично FluentNHibernate, однако синтаксис несколько отличается. Я бы не сказал, что это обязательно лучше, но я хотел перейти в NH 3.2 и уменьшить количество внешних зависимостей. FNH немного отстает от NH и в настоящее время поддерживает NH 3.1 (официально). См. Http://stackoverflow.com/questions/5777898/docs-examples-for-nhibernate-3-2-mapping-by-code –

+0

Отлично, я не понимал, что это было. Я могу изучить это, учитывая, что я только начинаю с Fluent. Я предполагаю, что мой первоначальный запрос может быть выполнен аналогичным образом, как вы упомянули выше? Также это нужно сделать из базового проекта, веб-приложения в моем случае, или это можно сделать из сборки «посередине», например, сборки доступа к данным. – Anthony

Смежные вопросы