Ho già sollevato questa domanda, ma sto ancora cercando di trovare un esempio che riesca a capirlo (per favore, non dirmi semplicemente di guardare al progetto S # arp Architecture senza almeno alcune indicazioni).Come posso implementare la sessione di NHibernate per richiesta senza una dipendenza su NHibernate?
Finora ho raggiunto l'ignoranza di persistenza nel mio progetto web. Le mie lezioni di repository (nel mio progetto di dati) prendono un'ISession nel costruttore:
public class ProductRepository : IProductRepository
{
private ISession _session;
public ProductRepository(ISession session) {
_session = session;
}
Nel mio global.asax espongo la sessione corrente e sto creando e smaltimento sessione su BeginRequest e EndRequest (questo è dove ho la dipendenza da NHibernate):
public static ISessionFactory SessionFactory = CreateSessionFactory();
private static ISessionFactory CreateSessionFactory() {
return new Configuration()
.Configure()
.BuildSessionFactory();
}
protected MvcApplication() {
BeginRequest += delegate {
CurrentSessionContext.Bind(SessionFactory.OpenSession());
};
EndRequest += delegate {
CurrentSessionContext.Unbind(SessionFactory).Dispose();
};
}
e infine il mio registro StructureMap:
public AppRegistry() {
For<ISession>().TheDefault
.Is.ConstructedBy(x => MvcApplication.SessionFactory.GetCurrentSession());
For<IProductRepository>().Use<ProductRepository>();
}
sembrerebbe ho bisogno delle mie proprie implementazioni generiche di ISession e ISessionFactory che posso usare nel mio progetto web e iniettare nei miei repository?
Quindi, per chiarire, sto utilizzando NHibernate nel mio livello di repository e voglio utilizzare una richiesta di sessione per per (http). Quindi sto iniettando una ISession nei miei costruttori di repository (usando structuremap). Attualmente per creare e disporre le sessioni in ogni richiesta ho dovuto fare riferimento a NHibernate dal mio progetto web. Questa è la dipendenza che vorrei rimuovere.
Grazie, Ben
NHibernate è secondo me non è una cattiva dipendenza. –
Il mio progetto web comunica con il repository e NHibernate è una dipendenza del repository. Se non fosse per il fatto che volevo sessione per richiesta, potevo semplicemente aprire le mie sessioni all'interno del livello repository. Tuttavia, desidero una sessione per richiesta, ma non voglio che il mio progetto web sia legato a NHibernate. –
Will Marcouiller: è ancora una dipendenza. Una dipendenza è una dipendenza. Cosa accadrebbe se Ben volesse trasferire la sua app su CouchDB o MongoDB o utilizzare un database di oggetti in memoria? –