blog.troelsrichter.dk
alt mellem bits og bytes

Fluent NHibernate med Linq og MySQL i Medium Trust

Monday, 7 December 2009 19:54 by dommer

Jeg er i gang med at udvikle en Silverlight applikation, hvor jeg gerne vil vise at applikationsstakken ikke nødvendigvis behøver være Microsoft bare fordi front-enden er det.

Så nu hedder applikationsstakken WCF som kommuikationslag, Castle Windsor som IOC/DI Container, Log4Net som logger, Fluent Nhibernate med NHLinq som OR-mapper og til sidst MySQL som primær Database provider, men SQLite til ”Unit-Test” samt i udviklingsmiljø.

Den positive nyhed først: ”Løsningen kører nu i medium trust i shared hosting”, men jeg har haft stærkt brug for min stædighed for at nå dertil :)

Grunden til at jeg bliver nød til at skrive herom er at jeg endnu ikke er løbet på andre der har kunnet sige dette samme  - i hvert fald ikke om FluentNHibernate.

Moralen til jer der ikke har lyst at læse om detaljerne er en gammel kending: ”Kend dit deployment miljø og release dertil fra start”. Det var ikke oprindeligt planen at løsningen skulle releases i shared hosting, så for mig har det været et dejligt lille eventyr på bagkant, som jeg gerne ville have løst undervejs i små bider. I nævnte applikationsstak har jeg haft udfordringer med samtlige bestanddele hvilket også har overrasket mig en del.

Medium trust

Hos de billigere hosting-udbydere vil dine applikationer som regel kun få lov at køre under et begrænset sikkerhedsniveau ide der hostes mange løsninger på samme maskine. De fleste tillader ikke mere end medium-trust, hvor det første du skal sikre dig er:

[assembly: AllowPartiallyTrustedCallers]

For at et assembly overhovedet får lov til at blive loaded af .NET-runtimet som kører i medium trust er det et krav at alle assemblies er kompileret med attributten AllowPartiallyTrustedCallers.

Nemmeste måde at tjekke det på er ved hjælp af reflector:

Castle Windsor kan bygges i en mode hvor dette flag sættes, MEN! Der vil stadig være et problem med dynamicProxy som muligvis er løst hvis du tjekker trunk versionen ud og bygger den. Men det jeg endte med at gøre var at hente denne version. Det opløftende her var at jeg fandt løsningen hos Martijn Boland, som var den første der udviklede et CMS Cuyahoga som kunne køre på MONO. Det  brugte jeg selv for nogle år siden – både til egen side og en løsning jeg lavede til en motorcykel-forhandler.

Fluent NHibernate er afhængig af NHibernate som er afhængig af Castle Windsor. Derfor måtte jeg tjekke kildekoden ud til FluentNNHibernate samt Linq og kombilere disse op imod NHibernate 2.1.2.4 overskrevet med omtalte version af Castle. Den stabile version af NHibernate havde et problem i kombination med MySQL.

Der ud over måtte jeg slå reflection optimizeren fra i FluentNHibernate, selvom Martijn ikke nævner at have gjort dette.

Environment.UseReflectionOptimizer = false;

Men jeg har på fornemmelsen at Automapperen i FluentNHibernate benytter denne på en måde så det går galt. Her gav jeg op i at finde en begrundelse men var bare glad for at jeg ikke skulle ændre andet :)

MySQL 6.2.1.0 benyttede jeg i den binære udgave og virkede med ovennævnte udgave af NHibernate.

Log4Net loggede intet i starten. Dette skyldes at der på sektioner i web.config tilmed skal sættes trust-level:

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false" allowDefinition="Everywhere"/>

Tilmed er APP_DATA bedste folder til formålet. Det er ikke altid du får lov at skrive andre steder.

SQLite kan ikke køre i medium trust, da den er afhængig af en native win32 dll som godt nok er indeholdt i System.Data.SQLite.DLL. Da jeg kun bruger SqLite til udvikling og test var dette ikke noget stort problem. Dog har jeg måtte undgå referencen fra mit projekt til denne dll og isedet kopiere den ind i bin output bin mappen efter behov. For bare det at den ligger i bin mappen ved deployment giver problemer.

Shared Hosting og WCF

I et shared hosting setup kan der være flere baseadresser der peger på samme ressource. Dette kan give problemer som gør at WCF ikke kan instanciere din sevice host. Min løsning var at implementere min egen ServiceHostFactory.

Puha. Selvom jeg har undladt en masse detaljer føler jeg trætheden kommer i gang fra dengang jeg brugte adskillige timer på disse problemer. Så derfor understrejer jeg lige igen. Nu virker det!

Selvom der har været en del problemer synes jeg alligevel også det er fedt, at man rent faktisk kan få en professionel applikationsstak op og køre i et billigt shared hosting enviroment. Så med denne post i baghånden er der ingen undskyldning for ikke at bruge alle de lækre open source komponenter der ligger derude og venter på at blive downloaded :)

Tags:   , ,
Categories:  
Actions:   E-mail | del.icio.us | Permalink | Comments (0) | Comment RSSRSS comment feed

WCF uden brug af proxyklasser i silverlight3 - part3 - messageclient

Monday, 9 November 2009 08:28 by dommer

I det tredie og foreløbige sidste afsnit er strukturen i min service lavet lidt om til en mere message baseret form.

Servicen har kun en enkelt metode som står for at sende en besked videre til en handler. Brugen fra klienten er inspireret af object client (fra part2), men på en typestærk facon.

wcf_uden_brug_af_proxyklasser_i_silverlight3_part_3_message_service.swf

Jeg programmerer idag efter nævnte arkitektur, og er rimelig godt tilfreds. Dog må jeg også erkende at der nu er indført så meget arkitektur, at løsningen nok skal holdes op imod f.eks. Ria Services, hvilket er Microsofts kommende bud på at lave et smidigt kommunikationslag i line of business sammenhæng.

Tags:   , ,
Categories:  
Actions:   E-mail | del.icio.us | Permalink | Comments (0) | Comment RSSRSS comment feed

WCF uden brug af proxyklasser i silverlight3 - part2 - objectclient fra netfxharmonics

Friday, 23 October 2009 10:53 by dommer

Den 17. September afholde Århus .NET Usergroup DevDays hvor Thomas Juul fra Tenteo afholdte et godt indlæg omkring Silverlight i Line og Business sammenhæng. En lille del heraf var brugen af en lille klient wrapper til at kalde ens WCF services med.

Denne har jeg selv afprøvet og her er min vurdering heraf:

wcf_uden_brug_af_proxyklasser_i_silverlight3_part_2_objectclient_fra_netfxharmonics.swf

Jeg kan allerede nu afsløre at jeg ikke er helt tilfreds, så har arbejdet videre med en ny løsning.

Fortsættelse følger...
Tags:   , ,
Categories:  
Actions:   E-mail | del.icio.us | Permalink | Comments (0) | Comment RSSRSS comment feed

WCF uden brug af proxyklasser i silverlight3 - part1 - den simple metode

Friday, 9 October 2009 11:15 by dommer

Jeg er i forbindelse med mit arbejde hos Trifork igang med at implementere en silverlight applikation. Vi har indtil nu arbejdet med line of business WPF applikationer og derfor er silverligt en teknologi vi må forholde os til og danne os en skarp mening om.

Noget af det første jeg er fokuseret på er at skabe en pæn måde at kommunikere mellem silverlight-klienten og backenden.

De fleste er nok enige om at man idag vil vælge WCF som den overordnede kommunikationsform, men jeg vil gerne frem til en løsning hvor service-konktrakten forbliver i fokus og der fra klientsiden ikke genereres en proxy til servicen.

Dette er måske en snæver problemstilling hvis man har en simpel service hvor kontrakten ligger nogenlunde fast. Men i en normal line of business applikation vil kontrakten hele tiden udvides efterhånden som ny funktionalitet kommer til og på sigt bliver dette en vigtig del af arkitekturen og skal derfor tænkes ind fra start.

Jeg har aldrig været med i et projekt hvor man har har ville skiftet databasen ud og derved gjort brug af et provider uafhængigt db-lag, men jeg har flere gange siddet i projekter hvor man gerne ville skifte kommunikationslaget ud, men hvor dette har været svært/umuligt grundet dyb afhængighed til f.eks. genererede proxyklasser.

Derfor vil jeg gerne se hvor om man kan opnå en tilfredsstillende arkitektur uden. Nedenfor er første del i søgen efter denne:

wcf_uden_brug_af_proxyklasser_i_silverlight3_part1_den_simple_metode.swf

Tags:   , , ,
Categories:  
Actions:   E-mail | del.icio.us | Permalink | Comments (0) | Comment RSSRSS comment feed