Jag kan tänka mig att jag inte är den enda som suttit med något litet hobbyprojekt i ASP.NET och kört med NHibernate som OR-mapper. Allt är guld och glada skogar tills man bestämmer sig för att köra applikationen på ett webbhotell som Loopia, Binero osv. Alla dessa webhotell brukar köra medium trust vilket innebär att man bl a inte har möjlighet att använda sig av Reflection, något NHibernate annars använder sig av (gällande Reflection så är Binero ett undantag, då de säger att dem tillåter Reflection, har dock inte testat detta hos dem). Det finns en rad olika inställningar man behöver göra för att lyckas få igång NHibernate i Medium Trust.
- Sätta attributet AllowPartiallyTrustedCallers på alla refererade assemblies
- Stänga av NHibernates Reflection Optimizer
- Stänga av lazy loading
Attributet som måste sättas på alla assemblies görs i AssemblyInfo.cs för varje refererat projekt:
[assembly: AllowPartiallyTrustedCallers()]
Reflection Optimizer stänger man enklast av i web.config. Det innebär att config-blocket för NHibernate kan se ut enligt följande:
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> <reflection-optimizer use="false"/> <session-factory> <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property> <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> <property name="connection.connection_string_name">MyConnectionString</property> <property name="connection.release_mode">on_close</property> <property name="show_sql">true</property> <mapping assembly="MyBusinessObjects" /> </session-factory> </hibernate-configuration>
Lazy Loading stänger man av genom att definera det i varje mappnings-fil:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false"> <class name="MyBusinessObjects.MyObject, MyBusinessObjects " table="MyObject"> <id name="Id" column="id" type="System.Int32"> <generator class="native" /> </id> <property name="Text" column="text" type="System.String" /> </class> </hibernate-mapping>
Detta är iallafall ett första steg att få igång NHibernate under Medium Trust. Det återstår dock en del jobb för att få det riktigt perfekt. Reflection är som sagt avstängt, vilket innebär att man inte kan använda lazy loading. Detta kan ha en negativ inverkan på prestandan. I NHibernate finns en ProxyFactory-klass som genererar proxyklasser som är nödvändiga för att kunna använda lazy loading. Lyckligtvis kan man i NHibernate konfigurera en egen ProxyFactory. Med verktyget NHibernate ProxyGenerators kan man generera en ProxyFactory och proxyklasser utifrån sina mappade klasser.
Detta har fungerat för mig på mitt Windows-konto hos Loopia där NHibernate kör mot en MySQL-databas. Jag har använt en liknande arkitektur som i artikeln NHibernate Best Practices with ASP.NET, 1.2nd Ed. för NHibernate sessionshantering osv.
Målet med min enkla demoapplikation är nu i nästa steg att få igång lazy loading med egna proxyklasser och i nästa steg få igång Fluent NHibernate på samma sätt.


