preload
Apr 23

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.

Tagged with:
Feb 18

Microsoft har på sistone blivit ganska duktiga på att komma med lite extra godis till deras befintliga ramverk. En av dessa nyheterna som jag kikat på är ASP.NET MVC Framework och jag tänkte försöka ge en blick av vad detta är.

Vad är MVC?

Någon gång på 70-talet “uppfanns” det som kallas för MVC (Model View Controller), som är ett designmönster som går ut på att man ska separera affärslogik och gränssnittslogik, kort och gott. Modellen ser ut som följande:

mvc

MVC Pattern

Vad betyder då de olika delarna? View representerar den grafiska representationen och gränssnittslogiken, som i en webbapplikation lämpligtvis är en HTML-sida. Model representerar affärslogiken och underliggande databaser osv. Controller hanterar förfrågningar från View för att denne ska få någon data att presentera.

Fördelen med detta är att man enklare kan testa de olika delarna i en applikation då rätt logik är på rätt plats så att säga, och testdriven utveckling är ju något som börjar bli mer och mer populärt.

mvc_project

MVC-solution i Visual Studio

Vad är ASP.NET MVC Framework?

ASP.NET MVC Framework är helt enkelt Microsofts implementation av MVC. Fördelarna som Microsoft själva pratar om är bl a “Seperation of Concerns”, testbarhet, läs- och sökmotorvänliga URL:er och renare HTML-kod (jämfört med ASP.NET WebForms). När man laddar ner ramverket får man en ny projekttyp att välja i Visual Studio (VS2008 rekommenderas).

När man skapar upp ett nytt ASP.NET MVC Application-projekt skapas automatiskt en standardapplikation som Microsoft har valt att skicka med för att man enkelt ska komma igång. Två projekt skapas upp, själva MVC-applikationen samt ett motsvarande Test-projekt där man skriver testerna för sina Controllers osv.

Tillsammans med exempelvis databaskoppling med LINQ-to-SQL till en vanlig SQL Server-databas kan man snabbt få igång en enkel applikation.

Detta är en väldigt kort introduktion till vad ramverket är för något. Jag kommer återkomma mer till detta och lite olika features i senare inlägg.

Tagged with: