---
title: "NHibernate best practise factory mm"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/169123-nhibernate-best-practise-factory-mm"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "freguz"
published: "2008-02-17T11:00:24.000Z"
updated: "2008-02-18T08:01:47.000Z"
replies: 7
views: 624
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/169123-nhibernate-best-practise-factory-mm"
---

# NHibernate best practise factory mm

## #1 — freguz, 2008-02-17T11:00Z

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?

Permalänk: https://www.webforum.nu/p/169123

## #2 — Nickemannen, 2008-02-17T11:14Z

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>

Permalänk: https://www.webforum.nu/p/2083292

## #3 — freguz, 2008-02-17T11:33Z

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();
```

Permalänk: https://www.webforum.nu/p/2083299

## #4 — Nickemannen, 2008-02-17T11:40Z

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

Permalänk: https://www.webforum.nu/p/2083300

## #5 — freguz, 2008-02-17T12:29Z

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

Permalänk: https://www.webforum.nu/p/2083314

## #6 — Nickemannen, 2008-02-17T12:56Z

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.

Permalänk: https://www.webforum.nu/p/2083322

## #7 — freguz, 2008-02-17T13:00Z

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.

Permalänk: https://www.webforum.nu/p/2083324

## #8 — spango, 2008-02-18T08:01Z

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();
        }
    }

}
```

Permalänk: https://www.webforum.nu/p/2083496

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/169123-nhibernate-best-practise-factory-mm
