Способ иметь отдельную реализацию выглядит следующим образом.
//inner_foo.h
template <typename T>
struct Foo
{
void doSomething(T param);
};
//foo.tpp
#include "inner_foo.h"
template <typename T>
void Foo<T>::doSomething(T param)
{
//implementation
}
//foo.h
#include <foo.tpp>
//main.cpp
#include <foo.h>
inner_foo имеет форвардные объявления. foo.tpp имеет реализацию и включает inner_foo.h; и foo.h будет иметь только одну строку, чтобы включить foo.tpp.
Во время компиляции содержимое foo.h копируется в foo.tpp, а затем весь файл копируется в foo.h после который он компилирует. Таким образом, ограничений нет, и именование согласовано в обмен на один дополнительный файл.
Я делаю это, потому что статические анализаторы для кода разбиваются, когда он не видит передовые объявления класса в * .tpp. Это раздражает при написании кода в любой среде IDE или с помощью YouCompleteMe или других.
]Вам нужна стратегия управления сеансом, которая позволит Вашему приложению эффективно работать и использовать преимущества того, что дает Вам NHibernate - в частности, кэширование и ленивая загрузка. [
] []Создание сеансов - недорогой процесс, требующий небольшого объема оперативной памяти или процессора, поэтому не стоит беспокоиться о сохранении или повторном использовании сеансов (действительно, повторное использование сеансов может привести к каким-то неприятным и непредвиденным побочным эффектам). Фабрика сеансов - дорогая вещь и должна быть построена один раз и только один раз при запуске приложения.[
] []Правило таково: время жизни сеанса должно быть достаточно продолжительным, чтобы у вас не осталось объектов, которые остаются в области видимости по окончании сеанса. [
] []По окончании сеанса все отслеживания изменений для объектов, которые вы получили из этого сеанса, прекращаются, так что эти изменения не сохраняются, если только вы намеренно не прикрепите этот объект к новому сеансу. Следовательно, сессия должна продолжаться до тех пор, пока объекты, которые Вы извлекли из неё, будут существовать. В веб-приложении это обычно означает сеанс для каждого запроса; в WinForms - сеанс для каждой формы.[
] [] В вашем случае, когда служба (я предполагаю, что она работает []как [] служба Windows) выполняет работу NHibernate, вы, возможно, захотите рассмотреть возможность создания сеанса для каждого нового запроса от потребляющего настольного приложения, и его утилизации, когда этот запрос был обработан. Не зная точно, как работает ваша служба и какой механизм используется настольным приложением для разговора с ней (удаленное? WCF? Обычный старый SOAP?), я не могу быть более точным. [
] [](Есть некоторые исключения из этого общего правила - допустим, у вас есть набор сохраняющихся объектов, которые представляют собой общий ресурс, к которому другой код будет обращаться, но не изменится, вы можете загрузить их заранее при запуске приложения и оставить отключенными)[
] []Если вы находите производительность вялой при такой стратегии, возможно, вы просто слишком много говорите с базой данных и ваш объектный график сложен; посмотрите на []кэширование второго уровня[] в этом случае.[
].] Сессия должна соответствовать единице работы. Сессия должна оставаться живой, пока Вы работаете с объектами, извлеченными или сохраненными с помощью этой сессии.[
].] В веб-приложении вы должны иметь по одной сессии на запрос. Это дает Вам полный контроль над временем работы сессии и упрощает обработку ошибок.[
] []В настольном приложении я рекомендую использовать сессию для одного докладчика (или формуляр, если Вы предпочитаете). Цитирую Ayende в статье []MSDN Magazine []:[
] [] []]Рекомендуемая практика для настольных приложений. приложения должны использовать одну сессию за формировать так, чтобы каждая форма в у приложения есть своя сессия. Каждая заявка форма обычно представляет собой особый произведение, которое понравится пользователю для выполнения, так что подходящий сеанс пожизненные работы довольно хорошо на практике. Добавленный преимущество в том, что у вас больше нет проблема с утечками памяти, потому что когда вы закрываете форму в приложение, вы также утилизируете сеанс. Это сделало бы все объекты, которые были загружены сессия, подлежащая рассмотрению сборщик мусора (GC).[
] []Есть дополнительные причины для того. предпочитая один сеанс в одной форме. Вы можете воспользоваться NHibernate's слежение за изменениями, так что он смывает все изменения в базе данных, когда вы совершить сделку. Также создает изоляционный барьер между различные формы, так что вы можете совершить изменения в одной организации без беспокоящийся об изменениях к другому сущности, которые показаны на других формы.[
] [
] Нет ни одного ответа, подходящего для всех ситуаций. Заседание 13 сессии []Лето Ниберната [] представляет собой хороший обзор вопроса. [
].]Большая часть фреймворка NHibernate и фреймворка Microsoft ADO.NET Entity Framework похожи друг на друга. Вот очень хорошая статья о том, как Вы должны управлять жизненной линией ObjectContext в ADO.NET EF.[
] [] []Она должна применяться и к сеансам NHibernate.[
].