Filed Under (C# code, Script#) by Christiaan van Bergen on June-29-2007

Hoe smerig het plaatsen van business logic in je UI laag ook klinkt, er zijn momenten dat je er toch voor mag kiezen. Neem de volgende situatie:

Een website die een online hypotheekberekening aanbiedt geeft de gebruiker de mogelijkheid om met ’slider-controls’ voor eigen inkomen, inkomen van de partner en koopsom van de woning te bepalen hoe hoog de maximale hypotheek is. Door de sliders te bewegen verandert uiteraard de hoogte van het maximum hypotheekbedrag. Maar niet alleen het hypotheekbedrag wijzigt. Wanneer je je inkomen te laag zet met de slider, is het ook goed mogelijk dat de maximale koopsom wordt verlaagd.

De rekenregels die nodig zijn voor de bepaling van de samenhangende bedragen, moeten aan de cliëntzijde aanwezig zijn om een snelle UI respons te bewerkstelligen (dit wordt uiteraard makkelijker met Silverlight). Goed, dit is een prachtig moment om Script# uit de kast te halen.

Wanneer je met Script# je rekenregels hebt geschreven (middels een Script# ClassLibrary) , dan beschik je al meteen over een C# codebase. Wat is er nu mooier dan deze code te gebruiken aan de serverzijde, in je domein zelfs. Je weet meteen zeker dat je aan beide zijden dezelfde code gebruikt.
Eén van de voordelen van Script# is dat er na een compile zowel een .js-bestand als een .net assembly wordt gecreëerd.

De .net assembly ga je gebruiken in je andere projecten. Je maakt de reference, schrijft de code die de assembly consumeert en compileert… En dan ineens wordt je geconfronteerd met de melding:

The type ‘System.Object’ is defined in an assembly that is not referenced. You must add a reference to assembly sscorlib …

Je denkt dus dat je in het project waarin je de Script# .net assembly referenced een reference moet maken naar de Script# sscorlib. Op zich juist, alleen dit zal waarschijnlijk onder andere resulteren in een melding als:

The type ‘System.Reflection.AssemblyVersionAttribute’ exists in both ’sscorlib.dll’ and ‘mscorlib.dll’

En dat spreekt eigenlijk voor zich. Er zijn nu twee frameworks referenced in je project, met beide dezelfde namen voor uiteenlopende zaken (Script# is immers een port van het .net framework naar JavaScript).
Om dit snel op te lossen kan je een tweede project aanmaken voor je Script# project. maar dan met het C# ClassLibrary template. Zorg ervoor dat het gegenereerde .csprj bestand in dezelfde directory staat als het Script# project. Voeg alle .cs bestanden toe aan je C# project die ook in het Script# staan. De projecten die voorheen verwezen naar de Script# .net assembly laat je nu verwijzen naar de nieuwe C# assembly. Et voila! Twee projecten op twee verschillende frameworks, één codebase.
Voor de echte die-hard moet er natuurlijk een oplossing mogelijk zijn in het MS Build script (ofwel het .csprj bestand) om hetzelfde te bewerkstelligen. Ik hoor het graag van je….



You must be logged in to post a comment.