icaaq, har du funderat på en ORMapper. Det ser ut som att du skriver onödigt mycket kod för varje klass.
Om du istället för att ha en UserInfo, VisitorInfo, ItemInfo osv osv har en gemensam klass som kan ta vilket objekt som helst och fylla det med data från databasen så kommer du spara riktigt mycket tid när du programmerarer.
Sedan gillar jag inte iden att BizLibet ärver från DAL:et. Ditt dal skall vara helt fristående från ditt BizLib. Däremot så skall BizLibet känna till ett Interface mot Dalet, som du har det nu så har du kopplat ihop ditt DAL med ditt BizLib lite väl hårt, IMHO.
Så här bygger jag mina applikationer med flera lager.
- UI (Typ webapplikation eller winforms eller något annat) vet allt om BizLibet och kan få tag i alla dess klasser som finns där. Men är endast kopplade genom en reference.
- BizLibet, det är alla mina klasser som kommer att användas av applikationen, typ User, Order, osv osv. BizLibet vet inget om DAL:et men har en reference till ORMappern's Interface
- ORMappern, här fyller jag mina objekt och collections med data från DAL:et. ORMappern består i princip av 3 funktioner (det finns några till) och det är LoadData(), SaveData(), DeleteData(). ORMappern bryr sig inte heller om vart jag spara min data, om det är i en XML-fil eller en Access databas eller en SQL Server, den känner dock till Interfacet för DAL:et
- DAL:et. Dalet har förmågan att använda sig av så många olika datakäller som jag orkar hantera. Varje ny datakälla (Access, MySQL, XML-fil) implementerar ett Interface IDataSource som ORMappern använder sig av för att hämta data och för att spara data. Just nu har jag bara en klass och det är för SQLServer, men om jag behöver ändra min datasource till en MySQL databas så kan jag enkelt gör det utan att behöva ändra i några andra lager.
Det du måste göra om du byter ut din MySQL mot en SQL Server, är att du skall gå igenom alla din Info klasser och ändra så de ärver från System.Data.SqlClient istället, samt att du måste kontrollera alla SQL statements så att de fungerar mot en SQL Server. Jag skriver en ny klass som kan hantera kommunikationen med MySQL och så fungerar min applikation som tidigare.
Så löst kopplat är bra, vill man koppla det ännu lösare så delar man upp sin applikation i flera skikt och lägger varje skikt på en egen dator och låter dessa kommunicera med varandra via WebServices eller .NET Remoting, det är dock lite överkurs.
Själv namngivningen av klasserna är inte så intressant, men jag brukar ha följande.
[FöretagetsNamn].[ApplikationensNamn].[LagretsNamn].[ClassensNamn]
Så om jag jobbade på MS och gjorde Word och skrev en Fil klass i bizlibet så blir det:
MS.Word.BizLib.Fil
Sedan om det är flera skikt så hamlar det mellan ApplikationensNamn och LagretsNamn, eller så byter jag ut LagretsNamn mot skiktnamnet: FrontEnd, MiddleWare, BackEnd
- Magnus