Ik ben met een collega bezig met het opzetten van een architectuur voor portal websites die gebruik maken van Dynamics CRM als database. Dit zullen sites zijn die gebouwd worden met ASP.NET MVC.
We willen dit modulair opzetten, zodat je snel een portal neer kan zetten op basis van bepaalde functionele blokken. Een basis portal zal bestaan uit een site waarop je kan inloggen en je eigen gegevens kan inzien / bijwerken. Hier bovenop moeten dus andere modules gebouwd kunnen worden die extra functionaliteit toevoegen.
De basis opzet is een DAL in de vorm van een WCF service waarin communicatie met de database plaatsvindt en conversielogica aanwezig is om Dynamics CRM entiteiten om te zetten naar domain entiteiten. Iedere webservice functie heeft zijn eigen request class en eigen response class (bijv. public GetNawResponse GetNaw(GetNawRequest request). Daarnaast is er dus een class library waarin domain objecten in gedefinieerd worden (Person, Company, Address etc.). Een business logic laag praat met de DAL en wordt aangeroepen vanuit de website.
We lopen nu tegen een paar dingen aan die voornamelijk te maken hebben met het modulair maken van de architectuur, waarvan we ons afvragen of dat niet handiger kan. Wat we nu hebben bedacht is om voor iedere module een aparte DAL te maken met bijhorende business logic laag. Het eerste waar je dan tegen aanloopt, is dat je meerdere WCF services krijgt, die allemaal een eigen web.config nodig hebben (waarin oa. de credentials voor de database staan). Ook heb je dus voor iedere module een aparte BLL.
Ieder BLL project bevat nog een tweede punt dat mij niet helemaal lekker zit. We hebben het nu zo ingericht dat in de BLL weer zijn eigen request - en response classes heeft, deze wrappen de classes uit de WCF service. Reden hiervoor is dat het dan mogelijk is om in de business laag extra logica kwijt te kunnen, maar het kan ook zo zijn dat het gewoon 1-op-1 doorgestuurd kan worden. Ieder BLL project heeft zijn eigen 'manager' waarmee je functionaliteit aan kan roepen, bijvoorbeeld:
We hebben nu een opzet gemaakt met de basis (NAW) functionaliteit en een tweede module en hoewel dat opzich wel werkt, zijn we benieuwd naar ervaringen van anderen en eventuele tips om dingen beter te kunnen doen, want het voelt nu alsof we niet alles even handig aanpakken.
We willen dit modulair opzetten, zodat je snel een portal neer kan zetten op basis van bepaalde functionele blokken. Een basis portal zal bestaan uit een site waarop je kan inloggen en je eigen gegevens kan inzien / bijwerken. Hier bovenop moeten dus andere modules gebouwd kunnen worden die extra functionaliteit toevoegen.
De basis opzet is een DAL in de vorm van een WCF service waarin communicatie met de database plaatsvindt en conversielogica aanwezig is om Dynamics CRM entiteiten om te zetten naar domain entiteiten. Iedere webservice functie heeft zijn eigen request class en eigen response class (bijv. public GetNawResponse GetNaw(GetNawRequest request). Daarnaast is er dus een class library waarin domain objecten in gedefinieerd worden (Person, Company, Address etc.). Een business logic laag praat met de DAL en wordt aangeroepen vanuit de website.
We lopen nu tegen een paar dingen aan die voornamelijk te maken hebben met het modulair maken van de architectuur, waarvan we ons afvragen of dat niet handiger kan. Wat we nu hebben bedacht is om voor iedere module een aparte DAL te maken met bijhorende business logic laag. Het eerste waar je dan tegen aanloopt, is dat je meerdere WCF services krijgt, die allemaal een eigen web.config nodig hebben (waarin oa. de credentials voor de database staan). Ook heb je dus voor iedere module een aparte BLL.
Ieder BLL project bevat nog een tweede punt dat mij niet helemaal lekker zit. We hebben het nu zo ingericht dat in de BLL weer zijn eigen request - en response classes heeft, deze wrappen de classes uit de WCF service. Reden hiervoor is dat het dan mogelijk is om in de business laag extra logica kwijt te kunnen, maar het kan ook zo zijn dat het gewoon 1-op-1 doorgestuurd kan worden. Ieder BLL project heeft zijn eigen 'manager' waarmee je functionaliteit aan kan roepen, bijvoorbeeld:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| public class NawManager { private readonly INaw _dal; public NawManager(INaw service) { _dal = service; } public GetNawBlResponse GetNaw(GetNawBlRequest blRequest) { var request = new GetNawRequest {ApiKey = blRequest.ApiKey, UserName = blRequest.UserName}; var response = _dal.GetNaw(request); return new GetNawBlResponse(response); } } |
We hebben nu een opzet gemaakt met de basis (NAW) functionaliteit en een tweede module en hoewel dat opzich wel werkt, zijn we benieuwd naar ervaringen van anderen en eventuele tips om dingen beter te kunnen doen, want het voelt nu alsof we niet alles even handig aanpakken.
Kater? Eerst water, de rest komt later