N-tier en LINQ to SQL

Zo, ik heb het voor elkaar.

Met de methode hoe ik nu LINQ to SQL heb toegepast in m’n solution kan ik toch de aloude n-tier architectuur blijven behouden.

Om dit te bewerkstelligen moet je jammergenoeg wel afstappen van de eenvoudige grafische user interface die Visual Studio 2008 aanbied. Je moet nu namelijk van de console applicatie SQLMetal.exe gebruik maken.

Ook wel te doen natuurlijk, maar het is een beetje jammer dat dit niet standaard in VS.Net 2008 kan.

Eerst heb ik vandaag enkele posts van Scott Guthrie doorgelezen.

De belangrijksten waren deze wel.

Using LINQ to SQL (Part 1)
https://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx

LINQ to SQL (Part 2 - Defining our Data Model Classes)
https://weblogs.asp.net/scottgu/archive/2007/05/29/linq-to-sql-part-2-defining-our-data-model-classes.aspx

LINQ to SQL (Part 3 - Querying our Database)
https://weblogs.asp.net/scottgu/archive/2007/06/29/linq-to-sql-part-3-querying-our-database.aspx

LINQ to SQL (Part 4 - Updating our Database)
https://weblogs.asp.net/scottgu/archive/2007/07/11/linq-to-sql-part-4-updating-our-database.aspx

In een van deze posts stond een linkje naar een video post van Mike Taulty. Op zijn weblog heb ik het volgende filmpje bekeken:

https://mtaulty.com/videos/nuggets/l2s/04_mt_l2s_codegentools.wmv

Dit is een enorm informatief stukje over LINQ to SQL.
Wanneer je dit filmpje hebt gezien kun je met een beetje fantasie wel begrijpen hoe je nu een n-tier architectuur kunt toepassen.

Ten eerste maak je de mapping XML en mapping CS bestanden aan.
Zelf heb ik dit gedaan door de volgende command-line te gebruiken in de Visual Studio 2008 Command Prompt in te tikken:

sqlmetal.exe /server:. /database:Weblog /map:WeblogMapping.xml /pluralize /namespace:Weblog.Information

Nu worden je mapping bestanden aangemaakt.
Deze zet je in een project waar je normaliter je information packages plaatst.

Het verschil met vroeger is dat je nu 1 groot CS-bestand hebt met daarin alle packages. Het XML-bestand dient voor de daadwerkelijke mapping naar de database. Het CS-bestand is alleen nodig om de objecten bruikbaar te maken in je code.

Nadat je dit hebt gedaan maak je vanuit je DataAccess laag een reference naar je project met de information packages.

Nu kun je vanuit je DataAccess gebruik maken van de objecten die zijn gedefinieerd in je information packages project. Je zult dit project uiteraard ook moeten toevoegen aan de Business- en Presentatie-laag, maar dat deed je vroeger ook al. Het grote voordeel van deze methode is dat de mapping bestanden geen Select, Insert, Update en Delete functies bevatten. Al je lagen kunnen dus niet geen verbinding maken met de database. Dit is alleen weggelegd voor de DataAccess.

Een stukje testcode dat ik nu in m’n DataAccess heb staan is dit:

DataContext ctx = new DataContext("server=.;database=Weblog", XmlMappingSource.FromUrl( System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + @"\\WeblogMapping.xml"));

Item item = new Item();
var query = from c in ctx.GetTable() select c;
foreach (Item c in query)
{
    //Doe iets
}
return;

Deze code slaat natuurlijk nog nergens op. Het is dan ook een voorbeeld van hoe je gebruik moet maken van je objecten en hoe je L2SQL kunt gaan gebruiken.

Het grootste nadeel is dat je nu niet meer een mooi dbml-bestand hebt en je niet meer via de grafische interface dingen kunt gaan doen.

Ook is het zo dat wanneer er een database wijziging plaats vind je opnieuw het cs- en xml-bestand moet aanmaken. In deze bestanden moet je zelf dus niet wijzigingen aanbrengen. Die gaan namelijk verloren zodra je opnieuw een mapping maakt. Dit is trouwens ook zo wanneer je wel gebruik maakt van de grafische interface.

Tijdens het ontwikkelen van L2SQL zijn ze er waarschijnlijk vanuit gegaan dat tijdens het ontwikkel proces het database ontwerp al vast ligt en hier niets meer aan veranderd.

Dat je geen wijzigingen kan/mag maken in de mapping bestanden is op zich niet er. Alle klassen zijn partial, waardoor je gewoon in een ander bestand eventuele extra code kunt toevoegen. Dat is dan wel aardig van de L2SQL ontwikkelaars.
PS: Denk er trouwens wel aan dat je het mapping xml-bestand altijd kopieert naar de output directory. Wanneer je dit niet doet, dan kun je geen gebruik maken van de functie XmlMappingSource.FromUrl(), aangezien er geen XML-bestand is om vanaf te ‘mappen’.


Share