Commit 09046cd0 authored by Johan Vervloet's avatar Johan Vervloet

Documentatie: traling slashes verwijderd, en een beetje opkuis <pre>..</pre>

De codefragmenten lijken nog steeds nergens op.
parent c0cc6de8
......@@ -6,24 +6,24 @@ Voorgestelde planning GAP
Release 1.5
-----------
\* Releasen rond de winter\
\* Fixen aanslepende issues\
\* Releasen rond de winter
\* Fixen aanslepende issues
\* Overzicht: version\#16
Grotere projecten
-----------------
\* Releasedatum onbekend, alnaargelang tijd en interesse\
\* API: \#845\
\* 'User Experience'\
\* Refactoring Backend: [ArchitectuurProblemen](ArchitectuurProblemen.md)\
\* Infrastructuur\
**** Security message queues: \#927\
\* Releasedatum onbekend, alnaargelang tijd en interesse
\* API: \#845
\* 'User Experience'
\* Refactoring Backend: [ArchitectuurProblemen](ArchitectuurProblemen.md)
\* Infrastructuur
**** Security message queues: \#927
**** Migratie SQL server: [MigratieSqlServer](MigratieSqlServer.md)
Vrijwilligersinzet
------------------
\* De vrijwilligers programmeren aan wat ze interessant vinden\
\* Fixes van issues uit version\#16 worden in december gereleaset\
\* De vrijwilligers programmeren aan wat ze interessant vinden
\* Fixes van issues uit version\#16 worden in december gereleaset
\* Andere zaken pas in release 1.6 of later
......@@ -22,7 +22,7 @@ Misschien kan dat wel, en moeten we nog uitvissen hoe.
Misschien kan het niet. In dat geval kan Chiro.Gap.Services opgesplitst
worden in Chiro.Gap.Services1 en Chiro.Gap.Services2 (maar dan met
betere namen).\
betere namen).
Chiro.Gap.Services1 zoekt dan voor elke call uit 'wie ben ik'?, en geeft
die informatie als dusdanig door aan dezelfde call in
Chiro.Gap.Services2, maar dan met 1 extra parameter (de user).
......
......@@ -30,21 +30,21 @@ PersoonInfo. Leg dan een reference naar
\[source:trunk/Solution/References/AutoMapper.dll\] in je project, en
voorzie deze using:
&lt;pre&gt;\
using [AutoMapper](AutoMapper.md);\
&lt;/pre&gt;
```
using [AutoMapper](AutoMapper.md);
```
Het mappen zelf, gebeurt dan als volgt:
&lt;pre&gt;\
```
IEnumerable&lt;GelieerdePersoon&gt; gelieerdePersonen;
// zorg ervoor dat gelieerdePersonen opgevuld geraakt
IList&lt;PersoonInfo&gt; infoVanPersonen =
Mapper.Map&lt;IEnumerable&lt;GelieerdePersoon&gt;,
IList&lt;PersoonInfo&gt;&gt;(gelieerdePersonen);\
&lt;/pre&gt;
IList&lt;PersoonInfo&gt;&gt;(gelieerdePersonen);
```
De eerste generieke parameter van Mapper.Map is het 'Brontype', de
tweede is het 'Doeltype', en Mapper.Map zet dus een object van het
......@@ -64,9 +64,9 @@ Chiro.Gap.ServiceContracts.Mappers.MappingHelper.MappingsDefinieren.
Als bron- en doeltype dezelfde veldnamen hebben, kan die configuratie zo
eenvoudig zijn als
&lt;pre&gt;\
Mapper.CreateMap&lt;Bron,Doel&gt;();\
&lt;/pre&gt;
```
Mapper.CreateMap&lt;Bron,Doel&gt;();
```
Maar omdat dat bij ons niet het geval is, is het allemaal wat
ingewikkelder. Mogelijk kunnen sommige zaken ook eenvoudiger dan hoe ze
......
......@@ -14,21 +14,21 @@ Concepten
Voorbeeld: Land
&lt;pre&gt;\
public partial class Land\
{\
public Land()\
{\
this.BuitenLandsAdres = new HashSet&lt;BuitenLandsAdres&gt;();\
```
public partial class Land
{
public Land()
{
this.BuitenLandsAdres = new HashSet&lt;BuitenLandsAdres&gt;();
}
public int ID { get; set; }\
public int ID { get; set; }
public string Naam { get; set; }
public virtual ICollection&lt;BuitenLandsAdres&gt; BuitenLandsAdres {
get; set; }\
}\
&lt;/pre&gt;
get; set; }
}
```
### Repository's
......@@ -42,13 +42,13 @@ get; set; }\
Voorbeeld:
&lt;pre&gt;\
// Haal alle groepen op waarvoor ik gebruikersrecht heb\
var groepen = (from g in \_groepenRepo.Select()\
where g.GebruikersRecht.Any(gr =&gt; gr.Gav.Login == mijnLogin)\
```
// Haal alle groepen op waarvoor ik gebruikersrecht heb
var groepen = (from g in \_groepenRepo.Select()
where g.GebruikersRecht.Any(gr =&gt; gr.Gav.Login == mijnLogin)
select g).ToList();
&lt;/pre&gt;
```
### Data context
......@@ -91,112 +91,112 @@ Voorbeeldimplementaties
### Details van een groep ophalen: `GroepenService.DetailOphalen`
&lt;pre&gt;\
public GroepDetail DetailOphalen(int groepID)\
{\
var resultaat = new GroepDetail\
{\
Afdelingen = new List&lt;AfdelingDetail&gt;()\
```
public GroepDetail DetailOphalen(int groepID)
{
var resultaat = new GroepDetail
{
Afdelingen = new List&lt;AfdelingDetail&gt;()
};
var groepsWerkJaar =\
\_groepsWerkJarenRepo.Select()\
.Where(gwj =&gt; gwj.Groep.ID == groepID)\
.OrderByDescending(gwj =&gt; gwj.WerkJaar)\
var groepsWerkJaar =
\_groepsWerkJarenRepo.Select()
.Where(gwj =&gt; gwj.Groep.ID == groepID)
.OrderByDescending(gwj =&gt; gwj.WerkJaar)
.FirstOrDefault();
if (!\_autorisatieMgr.IsGav(groepsWerkJaar))\
{\
throw FaultExceptionHelper.GeenGav();\
if (!\_autorisatieMgr.IsGav(groepsWerkJaar))
{
throw FaultExceptionHelper.GeenGav();
}
Debug.Assert(groepsWerkJaar != null);
// Lazy loading zorgt ervoor dat alle zeken die nodig zijn\
// Lazy loading zorgt ervoor dat alle zeken die nodig zijn
// voor het mappen uit de database worden opgehaald.
Mapper.Map(groepsWerkJaar.Groep, resultaat);\
Mapper.Map(groepsWerkJaar.Groep, resultaat);
Mapper.Map(groepsWerkJaar.AfdelingsJaar, resultaat.Afdelingen);
return resultaat;\
}\
&lt;/pre&gt;
return resultaat;
}
```
### Naam van een groep wijzigen: `GroepenService.Bewaren`
&lt;pre&gt;\
public void Bewaren(GroepInfo groepInfo)\
{\
var groep = (from g in \_groepenRepo.Select()\
where g.ID == groepInfo.ID\
```
public void Bewaren(GroepInfo groepInfo)
{
var groep = (from g in \_groepenRepo.Select()
where g.ID == groepInfo.ID
select g).FirstOrDefault();
// Momenteel ondersteunen we enkel het wijzigen van groepsnaam\
// en stamnummer. (En dat stamnummer wijzigen, mag dan nog enkel\
// Momenteel ondersteunen we enkel het wijzigen van groepsnaam
// en stamnummer. (En dat stamnummer wijzigen, mag dan nog enkel
// als we super-gav zijn.)
if (!\_autorisatieMgr.IsGav(groep))\
{\
throw FaultExceptionHelper.GeenGav();\
if (!\_autorisatieMgr.IsGav(groep))
{
throw FaultExceptionHelper.GeenGav();
}
Debug.Assert(groep != null);
if (String.Compare(groepInfo.StamNummer, groep.Code,
StringComparison.OrdinalIgnoreCase)
![]( 0 &amp;&amp; )\_autorisatieMgr.IsSuperGav())\
{\
throw FaultExceptionHelper.GeenGav();\
![]( 0 &amp;&amp; )\_autorisatieMgr.IsSuperGav())
{
throw FaultExceptionHelper.GeenGav();
}
groep.Naam = groepInfo.Naam;\
groep.Naam = groepInfo.Naam;
groep.Code = groepInfo.StamNummer;
// Er zijn wijzigingen die bewaard moeten worden.
\_groepenRepo.SaveChanges();\
}\
&lt;/pre&gt;
\_groepenRepo.SaveChanges();
}
```
### Nieuwe categorie toevoegen aan groep: `GroepenService.CategorieToevoegen`
&lt;pre&gt;\
public int CategorieToevoegen(int groepID, string naam, string code)\
{\
var groep = (from g in \_groepenRepo.Select()\
where g.ID == groepID\
```
public int CategorieToevoegen(int groepID, string naam, string code)
{
var groep = (from g in \_groepenRepo.Select()
where g.ID == groepID
select g).FirstOrDefault();
if (!\_autorisatieMgr.IsGav(groep))\
{\
throw FaultExceptionHelper.GeenGav();\
if (!\_autorisatieMgr.IsGav(groep))
{
throw FaultExceptionHelper.GeenGav();
}
Debug.Assert(groep != null);
// Check of de categorie al bestaat\
// Merk op dat we de categorieen niet expliciet hebben\
// opgevraagd. Entity framework doet dat voor ons, met\
// Check of de categorie al bestaat
// Merk op dat we de categorieen niet expliciet hebben
// opgevraagd. Entity framework doet dat voor ons, met
// lazy loading
var bestaande = (from c in groep.Categorie\
var bestaande = (from c in groep.Categorie
where String.Compare(c.Code, code, StringComparison.OrdinalIgnoreCase)
== 0\
== 0
select c).FirstOrDefault();
if (bestaande != null)\
{\
var info = Mapper.Map&lt;Categorie, CategorieInfo&gt;(bestaande);\
throw FaultExceptionHelper.BestaatAl(info);\
if (bestaande != null)
{
var info = Mapper.Map&lt;Categorie, CategorieInfo&gt;(bestaande);
throw FaultExceptionHelper.BestaatAl(info);
}
var nieuwe = new Categorie {Code = code, Naam = naam};\
groep.Categorie.Add(nieuwe);\
var nieuwe = new Categorie {Code = code, Naam = naam};
groep.Categorie.Add(nieuwe);
\_groepenRepo.SaveChanges();
return nieuwe.ID;\
}\
&lt;/pre&gt;
return nieuwe.ID;
}
```
Let op:
-------
......
......@@ -19,55 +19,55 @@ Als je git gebruikt, dan is het de gewoonte dat je voor elke feature die
je implementeert, een lokale feature branch maakt. Om te kijken welke
branches je lokaal hebt, typ je in je bashvenster
&lt;pre&gt;\
git branch\
&lt;/pre&gt;
```
git branch
```
De output ziet er dan ongeveer als volgt uit
&lt;pre&gt;\
eenbranch\
```
eenbranch
nogeenbranch
- dev\
&lt;/pre&gt;
- dev
```
Het sterretje voor 'dev' geeft aan dat de dev-branch op dit moment is
uitgepakt.
Een nieuwe feature branch maak je door het volgende in te tikken:
&lt;pre&gt;\
git branch mijnfeaturebranch\
&lt;/pre&gt;
```
git branch mijnfeaturebranch
```
Dit commando maakt een branch ('mijnfeaturebranch') vertrekkende van de
momenteel uitgepakte branch (in dit geval 'dev'). Om in die branch te
beginnen werken, moet je hem nog 'uitchecken':
&lt;pre&gt;\
git checkout mijnfeaturebranch\
&lt;/pre&gt;
```
git checkout mijnfeaturebranch
```
Alle bewerkingen die je nu [committen| commit](committen| commit.md), komen in de nieuwe
branch terecht.\
branch terecht.
Interessant om weten: het maken van een nieuwe branch en het uitchecken
kan ook gecombineerd worden in één opdracht. Hiervoor geef je het
volgende in:
&lt;pre&gt;\
git checkout -b mijnfeaturebranch\
&lt;/pre&gt;
```
git checkout -b mijnfeaturebranch
```
Stel dat je nu een tijd in mijnfeaturebranch gewerkt hebt, misschien al
wel een paar commits gedaan, en er is plots een dringend probleem dat je
eerst moet aanpakken. Dan kun je erg gemakkelijk terug naar de dev
branch. Van daaruit maak je dan een nieuwe branch voor de dringende fix:
&lt;pre&gt;\
git checkout dev\
git checkout -b dringendefixbranch\
&lt;/pre&gt;
```
git checkout dev
git checkout -b dringendefixbranch
```
(Eerst checken we de dev-branch opnieuw uit, zodat de nieuwe branch op
de dev-branch gebaseerd wordt. De constructie `checkout -b` combineert
......@@ -83,27 +83,27 @@ Stel dat je klaar bent met de wijzigingen in 'dringendefixbranch', dan
kun je de changes uit die branch makkelijk terug mergen naar de dev
branch:
&lt;pre&gt;\
git checkout dev\
git merge dringendefixbranch\
&lt;/pre&gt;
```
git checkout dev
git merge dringendefixbranch
```
Als dat allemaal goed is gelukt, kun je de 'dringendefixbranch' met een
gerust geweten opnieuw verwijderen:
&lt;pre&gt;\
git branch -d dringendefixbranch\
&lt;/pre&gt;
```
git branch -d dringendefixbranch
```
(TODO: [ConflictResolution](ConflictResolution.md) documenteren.) Hierna kun je verder
werken in 'mijnfeaturebranch'. Optioneel kun je die branch 'opschuiven'
naar de kop van 'dev', zodat de fixes die je in dev gemerged hebt,
meteen ook in je feature branch opgenomen zijn:
&lt;pre&gt;\
git checkout mijnfeaturebranch\
git rebase dev\
&lt;/pre&gt;
```
git checkout mijnfeaturebranch
git rebase dev
```
Remote branches
---------------
......@@ -114,9 +114,9 @@ in staat te synchroniseren met remote repositories. Gelukkig maar.
Als je
&lt;pre&gt;\
git branch -r\
&lt;/pre&gt;
```
git branch -r
```
intikt, dan krijg je alle remote branches te zien.
......@@ -132,13 +132,13 @@ Als alles goed is, begint de naam van die branches met
Stel dat je de recentste wijzigingen van origin/dev wil binnenhalen voor
je eigen dev-branch, dan doe je dat als volgt:
&lt;pre&gt;\
git checkout dev\
git pull origin dev\
&lt;/pre&gt;
```
git checkout dev
git pull origin dev
```
(Dit werkt enkel als je lokale wijzigingen [committen| gecommit](committen| gecommit.md)
of [stashen| gestasht](stashen| gestasht.md) zijn.)\
of [stashen| gestasht](stashen| gestasht.md) zijn.)
Je kunt ook wijzigingen uploaden naar de remote repository. Op die
manier kun je met meerdere personen aan dezelfde feature werken.
Bovendien heb je dan minder problemen als je harde schijf crasht :-)
......@@ -147,12 +147,12 @@ Je mag enkel pushen naar persoonlijke branches! Ik ga er even vanuit dat
je je feature hebt gemaakt in een lokale branch
'personal/username/mijnfeaturebranch':
&lt;pre&gt;\
```
git checkout personal/username/mijnfeaturebranch \# pakt lokaal
'mijnfeaturebranch' uit\
'mijnfeaturebranch' uit
git push origin personal/username/mijnfeaturebranch \# uploadt naar
remote 'mijnfeaturebranch'\
&lt;/pre&gt;
remote 'mijnfeaturebranch'
```
(Die eerste lijn is niet nodig als 'mijnfeaturebranch' al 'uitgecheckt'
is.)
......
......@@ -28,32 +28,32 @@ Als je in je source code wijzigingen doorvoert, moet je zowel de nieuwe
bestanden als de gewijzigde bestanden 'markeren' als 'to be committed'.
Let op, dat is dus anders dan bij subversion.
Als je op de command line het volgende ingeeft:\
&lt;pre&gt;\
git status\
&lt;/pre&gt;\
Als je op de command line het volgende ingeeft:
```
git status
```
dan krijg je een overzichtje te zien van de gewijzigde en nieuwe
bestanden die nog niet gemarkeerd zijn voor de volgende commit.
Bestanden die meegenomen moeten worden kun je als volgt toevoegen:\
&lt;pre&gt;\
git add path/naar/bestand\
&lt;/pre&gt;\
Bestanden die meegenomen moeten worden kun je als volgt toevoegen:
```
git add path/naar/bestand
```
Als er bestandsnamen of -types zijn die uitgesloten moeten worden van de
versiecontrole, kun je die toevoegen aan een relevant
`.gitignore`-bestand.\
`.gitignore`-bestand.
Van zodra je alle nodige bestanden 'geadd' hebt, kun je je changeset
committen:\
&lt;pre&gt;\
git commit\
&lt;/pre&gt;\
committen:
```
git commit
```
Vermeld in de omschrijving 'refs \#ticketnr' als je commit betrekking
heeft op het ticket met dat gegeven nummer, of 'closes \#ticketnr' als
je changeset dat ticket sluit.
Het is mogelijk om in één commando alle gewijzigde bestanden te 'adden'
en te committen, en wel als volgt:\
&lt;pre&gt;\
git commit -a\
&lt;/pre&gt;\
en te committen, en wel als volgt:
```
git commit -a
```
Let er wel op dat dit alleen opgaat voor gewijzigde bestanden; de nieuwe
zul je sowieso manueel moeten 'adden'.
......@@ -7,20 +7,20 @@ Chiro.Cdf.!DependencyInjectionBehavior
**** Voeg in Web.Config het volgende toe voor in system.serviceModel:
&lt;pre&gt;\
&lt;extensions&gt;\
&lt;behaviorExtensions&gt;\
```
&lt;extensions&gt;
&lt;behaviorExtensions&gt;
&lt;add name="DIServiceBehaviorExtension"
type="Chiro.Cdf.DependencyInjection.DIServiceBehaviorSection,
Chiro.Cdf.DependencyInjectionBehavior, Version=1.0.0.0, Culture=neutral,
[PublicKeyToken](PublicKeyToken.md)=null"/&gt;\
&lt;/behaviorExtensions&gt;\
&lt;/extensions&gt;\
&lt;/pre&gt;
[PublicKeyToken](PublicKeyToken.md)=null"/&gt;
&lt;/behaviorExtensions&gt;
&lt;/extensions&gt;
```
**** In de definitie van de service behavior die je voor je service
gebruikt, voeg je dit toe:
&lt;pre&gt;\
&lt;DIServiceBehaviorExtension /&gt;\
&lt;/pre&gt;
```
&lt;DIServiceBehaviorExtension /&gt;
```
......@@ -88,5 +88,5 @@ Als het nog niet werkt:
publieke netwerken.
Ik kreeg het voor GAP niet in orde zonder de firewall binnen het
domeiein uit te zetten.\
domeiein uit te zetten.
TODO: verfijnen
[DomainModel](DomainModel.md)
===================
Een aantal basisconcepten wat betreft GAP:\
Een aantal basisconcepten wat betreft GAP:
(**TODO:** de afbeeldingen in onderstaande links terug goed inline
zetten; dat is wat misgelopen met de conversie van trac naar redmine)
......
......@@ -7,33 +7,33 @@ Eager loading
Om in de backend de database aan te spreken, gebruiken we implementaties
van `IRepository&lt;T&gt;`. Zo is bijvoorbeeld in
`Chiro.Gap.Services.GroepenService` als volgt een 'ledenrepository'
gedefinieerd:\
&lt;pre&gt;\
private readonly IRepository&lt;Lid&gt; \_ledenRepo;\
&lt;/pre&gt;\
gedefinieerd:
```
private readonly IRepository&lt;Lid&gt; \_ledenRepo;
```
Via dependency injection in de constructor wordt er dan een geschikte
implementatie aan `_ledenRepo` toegekend. (Concreet een
`Chiro.Cdf.Poco.Repository&lt;Lid&gt;`).
Wanneer de backend nu een lid moet opzoeken, dan gebeurt dat typisch via
de `Select`-method van `IRepository&lt;Lid&gt;`. Bijvoorbeeld:\
&lt;pre&gt;\
de `Select`-method van `IRepository&lt;Lid&gt;`. Bijvoorbeeld:
```
var ledenQuery = (from ld in \_ledenRepo.Select() where ld.ID ==
LIDID);\
&lt;/pre&gt;
LIDID);
```
Bovenstaande method levert een `IQueryable&lt;Lid&gt;`, en pas wanneer
die geevalueerd wordt door bijvoorbeeld `.First()`, zal de database
gequery'd worden. Uit de database zal enkel opgehaald worden wat Entity
Framework op dat moment nodig vindt. Concreet haalt\
&lt;pre&gt;\
var lid = ledenQuery.First();\
&lt;/pre&gt;\
Framework op dat moment nodig vindt. Concreet haalt
```
var lid = ledenQuery.First();
```
enkel het betreffende lid op. Wat goed is. Maar als je dan achteraf iets
in deze stijl doet:\
&lt;pre&gt;\
Console.WriteLine(lid.GelieerdePersoon.Persoon.NaamEnVoornaam);\
&lt;/pre&gt;\
in deze stijl doet:
```
Console.WriteLine(lid.GelieerdePersoon.Persoon.NaamEnVoornaam);
```
dan zullen er nieuwe query's naar de database gestuurd worden om aan de
gevraagde naam te komen.
......@@ -42,15 +42,15 @@ Probleem
Meestal is dit een goede manier van werken. Maar soms niet. Concreet,
als de groepenservice wil weten hoeveel leden er geen voorkeursadres
hebben, dan gebeurde er vroeger dit:\
&lt;pre&gt;\
var aantalLedenZonderAdres = (from ld in \_ledenRepo.Select()\
hebben, dan gebeurde er vroeger dit:
```
var aantalLedenZonderAdres = (from ld in \_ledenRepo.Select()
where ld.GroepsWerkJaar.ID groepsWerkJaar.ID
&amp;&amp; ld.UitschrijfDatum
null &&\
ld.GelieerdePersoon.PersoonsAdres == null\
select ld).Count();\
&lt;/pre&gt;\
null &&
ld.GelieerdePersoon.PersoonsAdres == null
select ld).Count();
```
Toen Tommy de database monitorde, dan bleek dat er dan eerst een query
werd uitgevoerd naar leden waarvan de uitschrijfdatum null was. Die
leverde dan bijvoorbeeld 80 records op. Daarna kreeg de database dan 80
......@@ -63,16 +63,16 @@ Als oplossing hiervoor kunnen we **eager loading** gebruiken: we maken
aan de `Select`-method van de ledenrepository duidelijk dat we sowieso
van elk lid het persoonsadres van bijhorende gelieerde persoon nodig
hebben. Om dit mogelijk te maken, hebben we de repository wat
herschreven. Op dit moment gebeurt er in de plaats:\
&lt;pre&gt;\
herschreven. Op dit moment gebeurt er in de plaats:
```
var aantalLedenZonderAdres = (from ld in
\_ledenRepo.Select("GelieerdePersoon.PersoonsAdres")\
\_ledenRepo.Select("GelieerdePersoon.PersoonsAdres")
where ld.GroepsWerkJaar.ID groepsWerkJaar.ID
&amp;&amp; ld.UitschrijfDatum
null &&\
ld.GelieerdePersoon.PersoonsAdres == null\
select ld).Count();\
&lt;/pre&gt;\
null &&
ld.GelieerdePersoon.PersoonsAdres == null
select ld).Count();
```
Als nu de database gemonitord wordt, krijgt die gewoon 1 query met een
select count(\*). Een pak efficienter dus.
......
......@@ -15,10 +15,10 @@ Voor installatiehulp, zie [GitExtensions](GitExtensions.md).
- (Als dat niets doet, start dan eerst 'Git Extensions'. Je krijgt
een configuratiescherm. Meestal is alles in orde. Klik OK, sluit
Git Extensions, en dan zal het wel gaan.)
- Bij 'repository to clone' vul je het volgende in:\
&lt;pre&gt;\
http://websites.chiro.be/gap-git.git\
&lt;/pre&gt;
- Bij 'repository to clone' vul je het volgende in:
```
http://websites.chiro.be/gap-git.git
```
- De rest van de instellingen zal wel in orde zijn. Je kunt ze nog
tweaken als je dat nodig vindt.
......@@ -27,10 +27,10 @@ Voor installatiehulp, zie [GitExtensions](GitExtensions.md).
- In Windows Explorer klik je met de rechtermuisknop op een folder
waarin je de code wilt uitpakken.
- Klik 'Git bash here'.
- Tik het volgende:\
&lt;pre&gt;\
git clone http://websites.chiro.be/gap-git.git\
&lt;/pre&gt;
- Tik het volgende:
```
git clone http://websites.chiro.be/gap-git.git
```
- Het is de eerste keer dat je op die server connecteert, je zult
moeten bevestigen dat je de server vertrouwt.
......@@ -51,14 +51,14 @@ testgroep te werken, moet je dat ook aanpassen in
In die app.config-bestanden zoek je naar de lijn die begint met
`&lt;add name="ChiroGroepEntities"`, daar staat normaal:
&lt;pre&gt;\
```
&lt;add name="ChiroGroepEntities"
connectionString="metadata=res://\*/ChiroGroepModel.csdl|res://\*/ChiroGroepModel.ssdl|res://\*/ChiroGroepModel.msl;provider=System.Data.SqlClient;provider
connection string=&quot;Data Source=.\\SQLEXPRESS;Initial
Catalog=gap\_local;Integrated
Security=SSPI;MultipleActiveResultSets=True;Application
Name=gap&amp;quot;" providerName="System.Data.EntityClient" /&gt;\
&lt;/pre&gt;
Name=gap&amp;quot;" providerName="System.Data.EntityClient" /&gt;
```
Deze connection string werkt als je sql-server-instantie `SQLEXPRESS`
heet, je database `gap_local`, en dat je met Windows-authenticatie
......
......@@ -15,13 +15,13 @@ Als een service method een FaultException kan veroorzaken, dan moet dit
vermeld worden in het service contract. Zie bijvoorbeeld:
\[source:trunk/Solution/Chiro.Gap.ServiceContracts/IGelieerdePersonenService.cs@1955\#L295\]
&lt;pre&gt;\
\[OperationContract\]\
\[FaultContract(typeof(GapFault))\]\
\[FaultContract(typeof(FoutNummerFault))\]\
```
\[OperationContract\]
\[FaultContract(typeof(GapFault))\]
\[FaultContract(typeof(FoutNummerFault))\]
void [CommunicatieVormToevoegen](CommunicatieVormToevoegen.md)(int gelieerdePersoonID,
[CommunicatieInfo](CommunicatieInfo.md) commInfo);\
&lt;/pre&gt;
[CommunicatieInfo](CommunicatieInfo.md) commInfo);
```
Dit wil zeggen dat de method CommunicatieVormToevoegen een
FaultException&lt;![](GapFault&gt; of een FaultException&lt;)FoutNummerFault&gt;
......@@ -35,16 +35,16 @@ informatie over het probleem. Zie
\[source:trunk/Solution/Chiro.Gap.ServiceContracts/FaultContracts/FoutNummerFault.cs\].
De FoutNummerFault is vrij eenvoudig:
&lt;pre&gt;\
\[DataContract\]\
public class [FoutNummerFault](FoutNummerFault.md) : [GapFault](GapFault.md)\
{\
\[DataMember\]\
public [FoutNummer](FoutNummer.md) FoutNummer { get; set; }\
\[DataMember\]\
public string Bericht { get; set; }\
}\
&lt;/pre&gt;