15. september 2006 - 11:09Der er
17 kommentarer og 1 løsning
gennerelt ang. 3-tier
Jeg har forsøgt at finde artikler ang. 3-tier arkitektur. er der nogle der kan smide nogle gode links gerne med kode eksempler.
Jeg har læst et par forskellige artikler bla. fra Microsoft og fra andre fora, men synes ikke rigtigt de har givet mig nogle gode guidelines. nok nærmere gjort mig mere forvirret.
og her så et par spøgsmål til nederstående kode(kun illustrativt) 1) ER princippet for opbygning af koden ok eller ...?
2) Er det DAL klassen som generer SQL-sætningen eller BBL klassen?
3) Hvad skal DAL klassen returnere en Datareader eller Dataset?
Venlig Hilsen Kristian
public class DAL { private someConnection Con = new someConnection ();
public DAL () { Con.ConnectionString = ConfigurationManager.AppSettings["ConStr"]; } public ?? RetrieveData(BLL bl) { return ??; } } public class SomeObject { private string mbSomedata; private string mbSomedata; private string mbSomedata; } public class BLL { private somelist<SomeObject> List = new somelist<SomeObject>();
public BLL () { } public somelist getBLLdata (DAL da) { SomeObject tempObj; da.RetrieveData(this); //put data i tempObj List.add(tempObj);
Jeg vil mene at en DAL klasse som udgangspunkt bør være en 1 til 1 replikation af database strukturen, dvs. en klasse for hver tabel og en property for hver kolone. Hvad kontruktører angår kan du eksempelvis have en default som er empty samt en som tager id(hvis det er den som i din db som er unik) og henter den række i db'en som har det id og sætter sine properties med disse data. På den måde kan du på BLL niveau lave et DAL objekt udfra id og igennem dette tilgå den data som er i dette.
I BLL kan du så have, for GUI'en, logisk sammenhængende klasser, eksempelvis klasser som trækker på informationer fra op til flere DAL klasser. Samtidig er det et oplagt sted at lægge beregningsmetoder mm.
I de tilfælde hvor du i BLL har behov for data fra mere end en row i db'en vil jeg på DAL niveau lave en metode som returnere et dataset, så kan du i BLL'en trække den nødvendige data ud af dataset'et og om nødvendigt formatere det inden du via GUI'en præsentere brugeren for denne data.
Afslutningsvis kan man vel sige at GUI'en stiller BLL'en funktionalitet til rådighed for brugeren mens BLL'en stiller DAL'en funktionalitet til rådighed for GUI'en og DAL'en stiller databasens data til rådighed for BLL'en.
public sealed class HoldingDataService : OracleBaseService { public HoldingDataService () : base () { } public HoldingDataService (string StrCon) : base (StrCon) { } public DataSet Holding_GetAll () { string StrSql;
StrSql = "SELECT * FROM holding"; return ExecuteDataset (StrSql); } public DataSet Holding_CountAll () { string StrSql;
StrSql = "SELECT COUNT(*) AS NumberOfRecords FROM holding";
return ExecuteDataset (StrSql); } public DataSet Holding_GetByDates (DateTime from, DateTime to) { throw new Exception ("The method or operation is not implemented."); } public DataSet Holding_CountByDates (DateTime from, DateTime to) { throw new Exception ("The method or operation is not implemented."); } }
som tommelfinger regel skal du kunne skifte database uden at ændre en eneste linie kode i dit BLL
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.