Använda NHibernate under Medium Trust

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.

  1. Sätta attributet AllowPartiallyTrustedCallers på alla refererade assemblies
  2. Stänga av NHibernates Reflection Optimizer
  3. 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.

Guide: Sidnumrering i Word 2007

Jag kan tänka mig att jag inte är ensam om problemet vid uppsatsskrivning, där man vill att sidnumreringen ska börja på t ex sida 4, då man har försättsblad, abstrakt, innehållsförteckning osv, som ska vara onumrerade. Jag har varit ganska frustrerad då jag bara hittat hur man gör detta i Word 2003, men lyckades äntligen hitta funktionerna i Word 2007.

Det hela är ganska simpelt. Säg att du först skapar de sidorna du vill onumrerade. Se till att markören är i slutet av de sidorna du vill ha onumrerade, och klicka där efter på fliken Sidlayout. Under Utskriftsformat finns en knapp som heter Brytningar. Klicka på den och välj Nästa sida under Avsnittsbrytningar. Då har man skapat ett nytt avsnitt av de följande sidorna, alltså de som ska börja numreras på 1. Nästa steg är att skapa sidfot på någon av de sidorna som ska ha numrering. När redigeringen för sidfoten är aktiv, se till att fliken Design för sidhuvud och sidfot är aktiv. Där under Navigering, finns en knapp som heter Länka till föregående. Denna knapp ska inte vara intryckt, för att sidfoten i detta avsnitt ska vara oberoende av det som finns i föregående avsnitt. Efter att ha kontrollerat så att den inte är intryckt, är det bara att infoga sidnummer i sidfoten.

Om sidhuvudet ska skilja sig från det föregående avsnittet, behöver man troligtvis även där kontrollera samma sak med länkningen till föregående.

Hoppas min förklaring går att förstå. Något jag däremot inte förstår, är logiken i Office uppbyggnad!