zaterdag 23 februari 2008

Met de komst van het nieuwe .Net Framework 3.5 kunnen ontwikkelaars nu ook gebruik maken van een nieuwe feature welke schuil gaat onder de naam LINQ.

LINQ is een verzamelnaam voor, momenteel, 3 verschillende onderdelen.

Ten eerste is er LINQ to Objects (L2O).

Met L2O kunnen ontwikkelaars met behulp van LINQ-queries zoeken in verzamelingen van objecten. Een voorbeeld hiervan is een ArrayList. Tot op heden moest men altijd gebruik maken van for-loops om objecten in zo’n verzameling te zoeken, dit is met de komst van L2O verleden tijd. Met een LINQ-query kun je namelijk een selectie maken van de objecten die aan je eisen voldoen.

Ten tweede hebben we LINQ to XML (L2XML).

Net zoals met L2O, is het met L2XML mogelijk om te zoeken naar objecten, elementen of bijvoorbeeld waarden, dit doormiddel van een LINQ-query. Dit heeft ook weer als voordeel dat je niet meer zelf code hoeft te genereren om een XML-document in te lezen in een XMLDocument en hier stap voor stap door te lopen, net zo lang totdat je iets hebt gevonden dat je zocht. Met L2XML schrijf je een query met de LINQ-syntax en .Net zorgt voor de rest. Behalve dat dit vele regels code scheelt, bespaard het ook veel ontwikkel tijd.

Ten derde kunnen we nu gebruik maken van LINQ to SQL (L2SQL).

Zelf vind ik het werken met SQL en databases in het algemeen leuk en interessant werk, vandaar dat L2SQL mij het meest aanspreekt en ik hier ook iets verder over ga uitweiden. Met behulp van L2SQL wordt het mogelijk gemaakt om vanuit je .Net code dynamische queries te genereren welke op de database worden uitgevoerd. De queries zijn het beste te vergelijken met de aloude dynamische SQL statements welke men vroeger vaak ook in de code had staan. De afgelopen jaren is er een trend geweest om dynamische SQL in code niet meer te gebruiken en alleen nog maar gebruik te maken van stored procedures. Deze verschuiving van werkwijze was ook meer dan logisch, aangezien dynamische SQL statements behoorlijk veel veiligheidsrisico’s met zich mee kunnen brengen. In een tijd waar veiligheid hoog in het vaandel staat kun je dat dus niet gebruiken.

Het voordeel van L2SQL is dat je de flexibiliteit van dynamische SQL statements hebt, maar de veiligheid van stored procedures. Wanneer je een LINQ-query maakt, dan wordt deze ‘vertaald’ naar een parameterized query welke wordt uitgevoerd op de database. In figuur 1 is een voorbeeld te zien hoe een LINQ-query wordt vertaald in een SQL-query

Figuur 1

De queries die ik zelf heb gemaakt zijn redelijk eenvoudig en ook goed te bevatten voor een ontwikkelaar die nog niet eerdere een LINQ-query heeft gezien. Een voorbeeld alhier:

var query = from item in dataContext.GetTable<Information.Item>()

select item;

Deze LINQ-query heeft nog behoorlijk veel weg van een ‘normale’ SQL-query, echter zijn de verschillen ook duidelijk zichtbaar.

Als eerste valt op de term var. Dit is een nieuw type dat is geintroduceerd in het .Net Framework 3.5. Heel kort door de bocht is het type var niets anders als een declaratie voor een generic object. Uiteraard zijn er vast wel verschillen op te noemen, maar zelf vind ik het wel een prettige gedachte om het zo te benoemen.

Verder is in deze query te zien dat men nu gebruik kan maken van de termen from en select in Visual Studio, welke we eerder al kenden van SQL-queries. Met LINQ hebben beide termen eigenlijk dezelfde functie behouden, namelijk bij from wordt gekozen uit welk object er een selectie moet plaatsvinden en bij select wordt aangegeven wat er moet worden geretourneerd.

Het bovenstaande is nog redelijk eenvoudig, maar het moge duidelijk zijn dat met de komst van LINQ er behoorlijk veel tijd kan worden bespaard in de ontwikkeltrajecten.

Door L2SQL hoeven er immers niet meer tientallen, danwel honderden, stored procedures te worden gemaakt/gegenereerd voor eenvoudige CRUD-acties. Door L2XML is het niet meer nodig om tientallen regels code te schrijven om een XML-document te doorzoeken en door L2O hoeven ontwikkelaars niet meer tig foreach-loops te maken in de code. Over het algemeen betekend minder code ook dat er minder bugs gemaakt kunnen worden, wat dus automatisch resulteert in stabielere applicaties.

Een goede bron van informatie over LINQ is het weblog van Scott Guthrie. Hier heb ik zelf veel kennis opgedaan van de mogelijkheden over LINQ: http://weblogs.asp.net/scottgu/archive/tags/LINQ/default.aspx


donderdag 21 februari 2008

SharePoint features deel 1


Wat is een Feature?


Bij het ontwikkelen van op maat gemaakte oplossingen voor Windows SharePoint Services of Microsoft Office SharePoint Server 2007, is het van belang dat de ontwikkelaar goed begrijpt wat features zijn. Hiermee worden niet de standaard features bedoelt die in SharePoint geïntegreerd zijn, maar functionaliteiten/Features die de ontwikkelaar wil toevoegen aan de SharePoint oplossing.


Feature of functionaliteiten geven de ontwikkelaars de kans om elementen aan SharePoint sites toe te voegen. Deze elementen kunnen automatisch geactiveerd worden binnen een gekozen SharePoint Site of zelfs binnen een hele Site Collectie. Voorbeelden van elementen die gedefinieerd kunnen worden zijn onder andere lijst types, lijst instanties, menu commandos/links, pagina templates, pagina instanties, Event handlers, workflows etc.


Hoe zitten Features in elkaar?


Een Feature bestaat uit een folder die aangemaakt is in een speciale WSS systeem folder binnen het filesysteem van elke front-end Web server. De folder van een feature bestaat uit één of meerdere xml gebaseerde bestanden die Collabarotive Application Markup Language of kort gezegd CAML bevatten. Elke Feature folder bevat een manifest file genaamd feature.xml. Dit bestand definieert de hoge-level attributen zoals zijn ID en de Naam.


Naast een feature.xml bestaat een feature meestal nog uit andere xml bestanden zoals element.xml die de eigenlijke elementen van de feature beschrijft. Ook zouden er nog andere bestanden in kunnen staan voor templates, bijvoorbeeld een document template voor je lijst instantie/type of resources met afbeeldingen etc.


Om een betere indruk te krijgen van de opzet van een feature zou je naar de voorgedefinieerde features kunnen kijken die in WSS/MOSS aanwezig zijn. Hieronder zie je In Figuur 1 bijvoorbeeld de voorgedefinieerde features van WSS. De feature directory van MOSS zal er heel anders uitzien omdat deze meer dan 100 voorgedefinieerde features bevat.




Hoe maak ik een feature?


Een Feature is op verschillende manieren te bouwen. Hieronder vindt u 3 bekende methodes:



  1. Je maakt een folder aan binnen de feature map van SharePoint(C:/Program Files/Common Files/Microsoft Shared/web server extions/12/TEMPLATE/Feature. Nadat de feature is aangemaakt installeer je de feature via de command line tool van Visual Studio. Deze methode heeft natuurlijk als groot nadeel dat er in de directory van je server wordt gewerkt, en dit is niet altijd wenselijk.

  2. Je maakt voor je Feature een lege Visual Studio class library aan en ontwikkelt hierin de feature. Er zijn op internet tal van blogs/sites te vinden die hierbij kunnen helpen. Zelf heb ik veel aan deze site gehad. Op dezelfde pagina is nog meer info te vinden over wat features zijn. Er is tevens te lezen dat het erg veel werk is om op die manier een feature in je SharePoint omgeving te krijgen. Een voordeel is echter dat je niet direct binnen je server directory hoeft te werken.

  3. De laatste methode die ik hier beschrijf is via Windows Services extentions voor Visual Studio 2005. VS2005 versie 1.1 genereert automatisch de xml bestanden, "signed" de feature en via het build menu kan de site direct naar de server worden ge-deployed. Hoe je precies een feature maakt met behulp van deze tool zal ik later meer over vertellen. Als je niet kan wachten en er nu al mee aan de slag wilt, vindt je hier de WSS extension manual inclusief een voorbeeld.



URL's


WSS/MOSS demo en informatie:


http://www.wssdemo.com/default.aspx


WSS downloads:


Klik hier


WSS Visual Studio 2005 Extensions Manual:


Klik hier

donderdag 14 februari 2008

Microsoft Office SharePoint Server (MOSS) heeft ‘out-of-the-box’ workflow zoals het goedkeuren van documenten. Het nadeel van deze standaard workflow is dat het geschikt is voor één enkele taak, als deze is goedgekeurd stopt deze workflow.

Om een workflow uit te breiden zodat deze na een goedkeuring een volgende workflow start kan SharePoint Designer gebruikt worden. Hoe dit werkt wordt hieronder beschreven.

Maak een bibliotheek of lijst aan zoals bijvoorbeeld een lijst voor de aanvraag voor een laptop.


Stel een workflow (MOSS) in op deze lijst die start als er een nieuw item wordt aangemaakt.




Maak een workflow met SharePoint Designer die start wanneer de aanvraag voor de laptop wordt goedgekeurd. Deze workflow maakt een nieuw item aan in de lijst Bestellingen.





Op de Bestellingen lijst kan dan weer een workflow (MOSS) worden ingesteld zodat de juiste persoon weer een taak krijgt toegewezen. Hieronder staat het overzicht voor één bestelling workflow.


woensdag 13 februari 2008

In SharePoint (zowel WSS 3.0 en MOSS) kan er gebruik gemaakt worden van de structuurweergave (Tree View). Het activeren van dit handige navigatiehulpmiddel kan via de Site-instellingen.



Als voorbeeld zijn de volgende mappen geplaatst: Afdelingen, Software Solutions en SharePoint implementaties waadoor we drie niveaus krijgen.



De navigatie heeft een vaste breedte en hoogte waardoor er scrollbalken verschijnen. Om de breedte en hoogte dynamisch te maken, zodat deze zicht aanpast aan de inhoud, moet het volgende gebeuren:

-> Open de desbetreffende masterpage zoals default.master in bijvoorbeeld SharePoint Designer




-> Zoek de volgende tag:
sharepoint:sprememberscroll runat="server" id="TreeViewRememberScroll" onscroll="javascript:_spRecordScrollPositions(this);" style="overflow: auto;height: 400px;width: 150px; "



-> Vervang de vaste height en width met auto:
sharepoint:sprememberscroll runat="server" id="TreeViewRememberScroll" onscroll="javascript:_spRecordScrollPositions(this);" style="overflow: auto;height: auto;width: auto;
"
Nu krijgt de structuurweergave een dynamische afmeting: