Enkele dagen geleden was ik eens met Application roles in SQL Server aan het spelen. Dit werkt allemaal fijn, maar het probleem is dat je de application role iedere keer moet activeren als je de connectie opent.
Nu is het zo dat je -wil je een zo schaalbaar mogelijke applicatie- , je het best je connectie kunt sluiten van zodra je die niet meer nodig hebt. Op die manier kan je ook connection-pooling gebruiken.
Nu heb ik geen zin om iedere keer als ik een SqlConnection.Open() command doe, ook die application - role handmatig actief te gaan zetten. (Zie ook hier)
Daarom heb ik beslist om maar eens een DbHelper object te gaan ontwikkelen.
Nu, ik wil het ook direct goed aanpakken, en ik wil dat DbHelper object in al mijn projecten kunnen gebruiken. Ook die projecten dus die niet met Sql Server werken, maar met bv. Oracle.
Ook als ik in een project plots besluit om een andere DB te gaan gebruiken, wil ik daartoe in staat zijn, zonder dat ik het project hoef te recompilen.
Om zoiets te kunnen verwezenlijken, bestaat het Abstract factory pattern.
Een schema'tje van wat ik totnutoe heb ontwikkeld vind je hieronder:

Door deze constructie kan ik dus at-runtime laten bepalen welk type IDbHelper object ik nu nodig heb.
Ik kan ook eenvoudig een nieuw DbHelper object bijmaken voor bv. Oracle databases door de Oracle ADO.NET classes te gaan gebruiken.
Ieder type DbHelper heeft op die manier dus z'n eigen implementatie voor die methods. Zo kan ik in de OpenConnection method van SqlDbHelper bv een application-role gaan activeren mocht dat nodig zijn.
Nu, zit ik nog met het volgende 'ei'.
Waar ga ik best m'n Factory-object gaan creeëren? Ik had zelf gedacht om dat in de presentatie-laag te doen. Vanuit die laag kan ik nl. eenvoudig aan een configuratie-file waarin staat welk type DBMS de applicatie gebruikt.
Bv:
Dan had ik gedacht om m'n Factory-object simpelweg door te geven aan m'n DAL classes. In die DAL classes creeërt dat factory object dan het juiste DbHelper object en klaar is kees.
Nu, dat zal allemaal wel mooi werken enzo, maar het wringt ergens een beetje vind ik.
Als ik die factory in m'n presentatie-laag reeds creeër, meng ik dan m'n DAL code al niet te veel met m'n presentatie-code?
Ja en Nee, dat Factory object heeft nog niet echt iets met de datalaag te maken. Aan de andere kant is het op die manier wel mogelijk om in m'n presentatie-laag een Database object aan te maken.
Als ik het goed heb, kan ik ook de constructor(s) van de betreffende DbHelper objecten internal maken, zodat die enkel kunnen aangeroepen worden via de Factory-objecten.
Ik weet ook wel dat 'het design het project niet mag worden', maar ik had toch eens graag jullie opmerkingen, kritieken, etc.... gehoord. Wat wringt er? Wat zit er niet goed, wat kan er beter, ....
Nu is het zo dat je -wil je een zo schaalbaar mogelijke applicatie- , je het best je connectie kunt sluiten van zodra je die niet meer nodig hebt. Op die manier kan je ook connection-pooling gebruiken.
Nu heb ik geen zin om iedere keer als ik een SqlConnection.Open() command doe, ook die application - role handmatig actief te gaan zetten. (Zie ook hier)
Daarom heb ik beslist om maar eens een DbHelper object te gaan ontwikkelen.
Nu, ik wil het ook direct goed aanpakken, en ik wil dat DbHelper object in al mijn projecten kunnen gebruiken. Ook die projecten dus die niet met Sql Server werken, maar met bv. Oracle.
Ook als ik in een project plots besluit om een andere DB te gaan gebruiken, wil ik daartoe in staat zijn, zonder dat ik het project hoef te recompilen.
Om zoiets te kunnen verwezenlijken, bestaat het Abstract factory pattern.
Een schema'tje van wat ik totnutoe heb ontwikkeld vind je hieronder:

Door deze constructie kan ik dus at-runtime laten bepalen welk type IDbHelper object ik nu nodig heb.
Ik kan ook eenvoudig een nieuw DbHelper object bijmaken voor bv. Oracle databases door de Oracle ADO.NET classes te gaan gebruiken.
Ieder type DbHelper heeft op die manier dus z'n eigen implementatie voor die methods. Zo kan ik in de OpenConnection method van SqlDbHelper bv een application-role gaan activeren mocht dat nodig zijn.
Nu, zit ik nog met het volgende 'ei'.
Waar ga ik best m'n Factory-object gaan creeëren? Ik had zelf gedacht om dat in de presentatie-laag te doen. Vanuit die laag kan ik nl. eenvoudig aan een configuratie-file waarin staat welk type DBMS de applicatie gebruikt.
Bv:
code:
1
2
3
4
5
6
7
8
9
| string type = ConfigurationSettings.AppSettings["typeDB"];
if( type == "sqlserver" )
{
myDbFactory = new SqlFactory ();
}
else
{
myDbFactory = new OleDbFactory ();
} |
Dan had ik gedacht om m'n Factory-object simpelweg door te geven aan m'n DAL classes. In die DAL classes creeërt dat factory object dan het juiste DbHelper object en klaar is kees.
Nu, dat zal allemaal wel mooi werken enzo, maar het wringt ergens een beetje vind ik.
Als ik die factory in m'n presentatie-laag reeds creeër, meng ik dan m'n DAL code al niet te veel met m'n presentatie-code?
Ja en Nee, dat Factory object heeft nog niet echt iets met de datalaag te maken. Aan de andere kant is het op die manier wel mogelijk om in m'n presentatie-laag een Database object aan te maken.
Als ik het goed heb, kan ik ook de constructor(s) van de betreffende DbHelper objecten internal maken, zodat die enkel kunnen aangeroepen worden via de Factory-objecten.
Ik weet ook wel dat 'het design het project niet mag worden', maar ik had toch eens graag jullie opmerkingen, kritieken, etc.... gehoord. Wat wringt er? Wat zit er niet goed, wat kan er beter, ....
https://fgheysels.github.io/