webForumDet fria alternativet

NHibernate best practise factory mm

.NET

7 svar · 611 visningar · startad av freguz

Medlem sedan feb. 2005280 inlägg
Frågan#1

Har nu en väldigt basic sida med ett par metoder, eller egentligen har jag 3 st aspx sidor, med ett par metoder i varje som använder nhibernate.

Dock så har varje enskild metod fått hela paketet med

NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();
cfg.AddAssembly("plan9");

ISessionFactory factory = cfg.BuildSessionFactory();
ISession session = factory.OpenSession();

...vilket känns både onödigt och väldigt knasigt.

Var ska/bör man lägga de olika delarna i sin web-app?

Jag kan tänka mig att mina metoder bara ska innehålla:

ISession session = factory.OpenSession();
 ...
session.Close();

Kan man lägga

NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();
cfg.AddAssembly("plan9");
ISessionFactory factory = cfg.BuildSessionFactory();

in nån static som returnerar en SessionFactory till exempel?

Medlem sedan aug. 20003 575 inlägg
#2

Konfigurationen & SessionFactory'n skall inte ligga i aspx sidorna.

--- Redigerat ---
Jag skrev helt fel, det är sessionen som bör lagras i HttpContext.Current.Items
Och SessionFactoryn bör byggas en gång enbart och sedan lagra SessionFactory i en statisk variabel.

Det finns flera sidor på webben som tar upp just detta.

Denna länken tar upp denna saken samt lite andra tips.
http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx

Medlem sedan feb. 2005280 inlägg
#3

Där stod det en hel del ;) jag testade nu med en quick fix som jag undrar om den funkar hyfsat, verkar så i mina tester (än så länge)

skapade en egen statisk metod:

public class nhib
	{		
		public static ISessionFactory GetSessionFactory()
		{
                      NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();
                      cfg.AddAssembly("plan9");

                       return cfg.BuildSessionFactory();
		}
	} 
// hur sjutton pastear man in så formateringen blir bra...(

som jag hämtar i aspx filerna med

ISession session = nhib.GetSessionFactory().OpenSession();
Medlem sedan aug. 20003 575 inlägg
#4

Jag skulle mer göra såhär.

public class nhib
	{		
private static _sessionFactory;
		public static ISessionFactory GetSessionFactory()
		{
if(_sessionFactory == null)
{
                      NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();
                      cfg.AddAssembly("plan9");

                       _sessionFactory =  cfg.BuildSessionFactory();
}
return _sessionFactory;
		}
	}

Sedan hade jag nog inte haft det som en Util klass utan gjort en sida som ärvde av Page som implemmenterade en Property Session som i sin tur hade denna koden i sig.

public ISession Session
{
get
{
return HttpContext.Current.Items["NHibernateSession"] as ISession;
}
}

Och i HttpModule BeginRequest event

HttpContext.Current.Items["NHibernateSession"] = _sessionFactory.OpenSession();

I EndRequest

ISession session = HttpContext.Current.Items["NHibernateSession"] as ISession;
session.Dispose();

OBS isåfall lägger vi koden för att hämta SessionFactory i HttpModule och antingen instansierar den först när den behövs eller i ApplicationStart

Medlem sedan feb. 2005280 inlägg
#5

Tackar, jag kör med med static util så länge, eftersom det bara är ett litet test :bire

Medlem sedan aug. 20003 575 inlägg
#6

Tänk på att SessionFactory instansen skall vara static iallfall. Annars så vinner du inget på det.

BuildSessionFactory vill du bara göra en gång för hela applikationen.

Medlem sedan feb. 2005280 inlägg
#7

Japp, jag la in den som en static så som du påpekade, nu är det ingen fördröjning alls när man laddar sidorna.

Medlem sedan juni 20008 205 inlägg
#8

GetSessionFactory här är inte trådsäker. Bättre alternativ:

public static class NHibernateHelper
{
    public static ISessionFactory SessionFactory
    {
        get { return InstanceHolder.SessionFactory; }
    }

    private static class InstanceHolder
    {
        public static readonly ISessionFactory SessionFactory;
        static InstanceHolder()
        {
            NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();
            cfg.AddAssembly("plan9");
            SessionFactory = cfg.BuildSessionFactory();
        }
    }

}
257 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)