Debbo dire che più conosco nhibernate più lo apprezzo veramente tanto. Stasera mi sono chiesto, posso iniettare una mia connessione in una sessione? Lo scopo di una simile operazione è vario, potrei ad esempio iniettare una connessione durante un test per potere poi fare query dirette al database e verificare che i dati siano scritti bene, oppure potrei volere eseguire codice SQL diretto assieme a nhibernate in una unica transazione etc etc. LA soluzione a questo problema è veramente banale :D.
Nhibernate definisce un interfaccia chiamata IConnectionProvider tramite la quale la sessionFactory recupera la connessione da dare in pasto alla sessione, solitamente viene utilizzato un provider di default definito da queste due righe di configurazione.
<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<add key="hibernate.connection.connection_string" value="MiaStringaConnessione" />
NAturalmente se si volesse creare un proprio provider è sufficiente ereditare da una classe astratta chiamata ConnectionProvider, di cui è possibile implementare la sola funzione GetConnection().
public class MyConnectionProvider : ConnectionProvider {
public override System.Data.IDbConnection GetConnection() {
IDbConnection conn = new SqlConnection("Server=localhost\\sql2000;initial catalog=NorthWind;User Id=sa;password=ottaedro_2006@");
conn.Open();
return conn;
}
}
Come si può vedere nell'esempio in questione la connessione viene costruita con una stringa hardcoded, ma le possibilità sono indubbiamente aperte alla nostra fantasia. Chiaramente per sfruttare questo nuovo provider di connessioni è necessario specificare la classe desiderata nel file di configurazione e la connessione restituita deve essere stata precedentemente aperta.
<add
key="hibernate.connection.provider"
value="NorthwindTest.MyConnectionProvider, NorthwindTest" />
<add key="hibernate.connection.connection_string" value="MiaStringaConnessione" />
Non dimenticate di mettere sempre la configurazione connection_string perchè se non presente l'oggetto ConnectionProvider di base genererà un eccezione.
Alk.