2010-04-23 10 views
6

Pytanie następujące po Fluent NHibernate + multiple databases (nie trzeba stosować się do tego linku, tutaj powinno być wystarczająco dużo tła).Jak zidentyfikować fabrykę sesji konkretnej jednostki z płynnymi NHibernate i wieloma bazami danych

Mój problem jest taki:

Używam Fluent NHibernate. Moja aplikacja korzysta z wielu baz danych. Każda baza danych ma swoje własne jednostki zarejestrowane (odwzorowane) przeciwko niemu. W rezultacie mamy wiele fabryk sesji, z których każda odnosi się do pojedynczej bazy danych, a każda z nich zawiera własny zestaw mapowanych elementów.

Dla podmiotów ładujących stworzyłem ogólną klasę Factory, która zapewnia pewne standardowe metody ładowania, które można zastosować dla dowolnego zarejestrowanego podmiotu (w dowolnej bazie danych). Problem polega na tym, że metody ładowania muszą używać poprawnej fabryki sesji dla klasy jednostek, z którymi jestem zajęty. Jak ustalić, z której fabryki sesji muszę korzystać? Mam wszystkie fabryki sesji "pod ręką" (i indeksowane według nazwy bazy danych), po prostu potrzebuję sposobu, wiedząc, jaki typ Jednostki chcę załadować, wybierając odpowiednią Sesjonowaną Fabrykę do użycia.

Na przykład:

public IBaseBusinessObject CreatePopulatedInstance(Type boType, Guid instanceKey) 
{ 
    IBaseBusinessObject result = null; 
    ISessionFactory sessionFactory = GetSessionFactory(boType); 
    using (ISession session = sessionFactory.OpenSession()) 
    { 
    using (session.BeginTransaction()) 
    { 
     result = (IBaseBusinessObject)session.Get(boType, instanceKey); 
    } 
    } 
    return result; 
} 

Co musi iść w GetSessionFactory (boType)?

Dzięki za przeczytanie!

Odpowiedz

3

Zacznę od zapoznania się z metodą ISessionFactory.GetClassMetaData.

IClassMetadata metadata = sessionfactory.GetClassMetadata(boType); 

Jeśli można utrzymać listę swoich ISessionFactory przypadkach można wyliczyć swój sposób przez nich, aż znajdziesz taki, który posiada metadanych dla typu boType.

Nigdy go nie używałem i nie mam żadnych odniesień do strony, ale spodziewam się, że zwróci wartość null lub zgłosi wyjątek, jeśli nie rozpoznaje typu. Jeśli otrzymasz wartość metadanych bez błędu, to jest to fabryka sesji.

Powodzenia

Neil.

+0

Wielkie dzięki. To rozwiązanie działało. – Trevor

+0

Metoda GetClassMetadata() zwraca wartość null, jeśli określony typ nie jest zarządzany przez odpowiednią fabrykę sesji. – Trevor

+0

Nie ma za co. –

Powiązane problemy