Avatar billede kmn_dk Nybegynder
15. september 2006 - 11:09 Der 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);

        return List;
    }
}
Avatar billede mikkel_sommer Nybegynder
15. september 2006 - 11:34 #3
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.
Avatar billede mikkel_sommer Nybegynder
15. september 2006 - 11:42 #4
Da sql sætningen er linket imellem DAL og database vil jeg mene at det er i DAL klassernes kontruktører og metoder disse bør genereres.
Avatar billede arne_v Ekspert
15. september 2006 - 15:12 #5
re 1)

Ikke helt.

BLL skal ikke kaldes med DAL.

Jeg synes at dit DAL er for low level.

re 2)

DAL

BLL aner ikke at data ligger i en database

re 3)

type safe collection af data klasse - bedst
data set - OK
IDataReader - OK i nogle tilfaelde
XxxxDataReader - fy


Hvad skal DAL klassen returnere en Datareader eller Dataset?
Avatar billede arne_v Ekspert
15. september 2006 - 15:16 #6
(den sidste linier er bare en copy paste fra spm. - skal ignoreres)
Avatar billede arne_v Ekspert
15. september 2006 - 15:19 #7
jeg lavede et eksempel her:
  http://www.eksperten.dk/spm/654026
lidt forsimpelt men med en del gode pointer i !

ioevrigt foretraekker jeg at kalde det vi snakker om for layers og ikke tiers

tiers er for mig noget som kan men ikke skal gaa over netvaerk

(check evt. http://www.eksperten.dk/artikler/148)
Avatar billede arne_v Ekspert
15. september 2006 - 15:21 #8
generelt skal dine layers vaere nemme at udskifte med en anden implementation med minimal helst ingen
aendring af lavet ovenover

det vil du typieks goere ved kun at expose:
  interface
  factory
  rene data klasser uden funktionalitet
Avatar billede kmn_dk Nybegynder
15. september 2006 - 15:22 #9
ok så lidt mere opklaring af spørgsmålen:

DAL så et private member af BLL klassen ?
Avatar billede arne_v Ekspert
15. september 2006 - 15:36 #10
yep
Avatar billede kmn_dk Nybegynder
22. september 2006 - 11:58 #11
Er dette et bedre forslag til koden:

public abstract class OracleBaseService : IDisposable
{
    private bool disposed = false;
    private OracleConnection OracleCon = new OracleConnection();
    private OracleCommand OracleCmd = new OracleCommand();
    private OracleDataAdapter OracleDa = new OracleDataAdapter ();

    protected OracleBaseService ()
    {
        OracleCon.ConnectionString = GetConnectionString ();
    }
    protected OracleBaseService (string strCon)
    {
        OracleCon.ConnectionString = strCon;
    }
    protected string GetConnectionString ()
    {
        return ConfigurationManager.ConnectionStrings["OracleCon"].ConnectionString;
    }
    protected DataSet ExecuteDataset (string sql)
    {
        DataSet Ds = new DataSet ();
        try
            {
            OracleCmd.CommandType = CommandType.Text;
            OracleCmd.CommandText = sql;
            OracleCmd.Connection = OracleCon;
            OracleCon.Open ();
            OracleDa.SelectCommand = OracleCmd;
            OracleDa.Fill (Ds);
        }
        catch
        {
            throw;
        }
        finally
        {
            OracleCon.Close ();
        }
            return Ds;

    }

    #region IDisposable Members
    public void Dispose ()
    {
        Dispose (true);
        GC.SuppressFinalize(this);
    } //Dispose ()
    protected virtual void Dispose (bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                //managed resources here.
                OracleDa.Dispose ();
                OracleCmd.Dispose ();
                OracleCon.Dispose ();
            }
            //unmanaged resources here.
        }
        this.disposed = true;
    } // Dispose (bool disposing)
        ~OracleBaseService ()
    {
        Dispose (false);
    } // ~OracleBaseService ()

    #endregion
} //OracleBaseService
Avatar billede kmn_dk Nybegynder
22. september 2006 - 11:59 #12
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.");
    }
}
Avatar billede arne_v Ekspert
23. september 2006 - 04:30 #13
Det begynder jo at ligne Microsoft DAAB en lille smule.

Jeg ville ikke expose database typen, men sådan er der så meget.
Avatar billede kmn_dk Nybegynder
25. september 2006 - 09:23 #14
Kan du uddybe lidt nærmere ?

Sætter pris på dine kommentarer

Venlig hilsen
Kristian
Avatar billede arne_v Ekspert
26. september 2006 - 04:40 #15
prøv og søg på Microsoft Data Access Application Block

----

jeg mener at det er dårligt at have en klasse med database typen i navnet

(medmindre du har en for hver database og encapsulater det hele i noget factory
et eller andet)

det hænder altså at man skal skifte database
Avatar billede kmn_dk Nybegynder
26. september 2006 - 08:42 #16
tak arne smid et svar
Avatar billede arne_v Ekspert
26. september 2006 - 13:16 #17
ok
Avatar billede arne_v Ekspert
26. september 2006 - 13:16 #18
som tommelfinger regel skal du kunne skifte database uden at ændre en eneste
linie kode i dit BLL
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester