Avatar billede dresen Nybegynder
17. juli 2006 - 10:43 Der er 18 kommentarer

Multi-tier uden wizards tak

Hej alle

Jeg søger hjælp til at komme godt i gang med ASP.NET og C#.

Det jeg som udgangspunkt gerne vil er at præsentere data hentet i en database og dernæst også tilbyde at skrive tilbage til den.

Det er allerede lykkedes mig at gøre ovenstående, men dette ved at gøre brug af en masse server controls som er blevet konfigureret vha. forskellige wizards.

Skal man bare acceptere et sørgeligt liv med wizards, eller er der chance for at man kan komme til at programmere?

Ved at have læst forskellige tråde om multi tier arkitektur, kan jeg se at det jeg har lavet ikke er det mest elegante, da der er direkte adgang fra præsentationslaget til databasen.

Kan I henvise til eller præsentere et overordnet design, som løser overordnet udfordring mere elegant - velsagtens ved at følgende layers: DAL, PL og BLL.
Avatar billede snepnet Nybegynder
17. juli 2006 - 10:50 #1
De indbyggede wizards forhindrer dig ikke i at lave en flerlags arkitektur, men hvis du bare trækker databasetabeller ind på dine sider får du det ikke.
Du kan tage et kig her - det er nok en ganske udmærket sted at starte:
http://www.asp.net/learn/dataaccess/default.aspx?tabid=63
Mvh
Avatar billede dresen Nybegynder
17. juli 2006 - 11:35 #2
Hej snepnet

Tak for dit svar.

Jeg har kastet et kig på følgende tutorial: http://www.asp.net/learn/dataaccess/tutorial01cs.aspx?tabid=63

I denne tutorial gøres der brug af en tableadapter mellem dataset og databasen. Koden ser ud som følger:

C#

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindTableAdapters;

public partial class AllProducts : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        ProductsTableAdapter productsAdapter = new
        ProductsTableAdapter();
        GridView1.DataSource = productsAdapter.GetProducts();
        GridView1.DataBind();
    }
}

Jeg kan se at de bruger "using NorthwindTableAdapters". Jeg gætter på at det er for at kunne referere til ProductsTableAdapter som type i koden. Kan du fortælle mig, hvordan jeg finder ud af, hvilken adapter jeg skal skrive som "using". Tager adapteren navn efter den database man har oprettet? Min database bærer det fine navn kundekartotek.

på forhånd tak/ dres
Avatar billede dresen Nybegynder
17. juli 2006 - 11:44 #3
Har forsøgt at imitere eks. fra ovennævnte tutorial, men har ikke haft held til at gøre dette ordentligt. Har ganske naivt forsøgt mig med "using KundeKartotekTableAdapters

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections;
using KundeKartotekTableAdapters;


public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        FirmaTableAdapter fAdapter = new FirmaTableAdapter();
        GridView1.DataSource = fAdapter.GetFirms();
        GridView1.DataBind();
       
    }

    protected void TextBox1_TextChanged(object sender, EventArgs e)
    {

    }
}




Dette resulterede i følgende fejl:

Error    73    The type or namespace name 'KundeKartotekTableAdapters' could not be found (are you missing a using directive or an assembly reference?)    C:\Websites\DB_with_DAL\Default.aspx.cs    11
Avatar billede dresen Nybegynder
17. juli 2006 - 11:51 #4
Avatar billede snepnet Nybegynder
17. juli 2006 - 12:02 #5
Ok :o)
Vær opmærksom på at det blot er én mulig implementering de har lavet. Der er mange der bedre kan lide at lave deres helt egne typer (og ikke benytte typed datasets, adapters  etc).
Mvh
Avatar billede dresen Nybegynder
17. juli 2006 - 12:37 #6
Hej snepnet

Tak fordi du gør opmærksom på dette.

Jeg kunne godt tænke mig at lave eks. med egne typer, da jeg vil tro det kan give mig en bedre forståelse af de størrelser der er i sammenspil.

Det opleves svært at få en ordentlig forståelse, når meget gemmes væk i wizards og derefter genereret kode.

Kender du til gode ressourcer, hvor fokus er rettet mere mod mere "selvgjorte løsninger".

Mit spørgsmål givetvis min ringe forståelse af hele området. Håber du kan deducere hvad det er jeg ønsker.

Det må snart være tid til nogle points.

/dresen
Avatar billede arne_v Ekspert
17. juli 2006 - 13:25 #7
Hvis vi ser lidt væk fra VS wizards og diverse smarte frameworks klasser, så
har jeg haft en multi spørgsmåls dialog med over det sidste års tid med
websam om nogle af disse ting (med deltagelse af andre også).

[det meste af koden er VB.NET og ikke C# men det det betyder ikke noget
for pointerne]

Du kan læse her:

http://www.eksperten.dk/spm/654026
http://www.eksperten.dk/spm/690642
http://www.eksperten.dk/spm/695119
http://www.eksperten.dk/spm/719127
Avatar billede snepnet Nybegynder
17. juli 2006 - 13:32 #8
Well... Der er self. en del forskellige måder at gøre det på, og du kan også få hjælp til det, selvom du ikke vil benytte datasets.
F.eks. kan du bruge en OR-Mapper, hvilket typisk er et framework der kan hjælpe med at instantiere objekter udfra data i en relationel database, og gemme dem igen.

En mulig (og jævnligt set model i forbindelse med OR-Mappere) er principielt struktureret således at du får klasser som nedenfor viste at arbejde med:

(Det er blot et konceptuelt et eksempel)
public class Customer
{
  private int m_Id;
  private string m_Name;

  public int Id
  {
    get{return m_Id;}
  }

  public string Name
  {
    get{return m_Name;}
    set{m_Name = value;}
  }
 
  public static Customer Retrieve(int id)
  {
    // ...
  }

  public static CustomerCollection RetrieveAll()
  {
    // ...
  }

  public void Save()
  {
    // ...
  }
}

Ovenstående klasse vil give dig muligheden for at skrive klientkode som dette:

Customer c = Customer.Retrieve(25);
c.Name = "Hans";
c.Save();

Og

CustomerCollection customers = Customer.RetrieveAll();
Som du så kan databinde etc.

Det der så selvfølgelig mangler er koden der reelt henter/gemmer data, og det er så typisk den kode en OR-Mapper vil kunne fikse.

Ville du lave det selv, kunne du jo - for eksemplets skyld - skriver koden direkte i f.eks. Retrieve-metoden:

public static Customer Retrieve(int id)
{
  // instantier forbindelse
  // instantier kommando
  // instantier parameter på kommando objekt, og sæt værdi til kriteriet (id)
  // udfør kommando
  // instantier Customer objekt, og benyt de værdier der er hentet i basen
  // returnér Customer objekt
}

Men.... Da det sjældent er nogen fordel, at flette al database håndtering ind i sådanne forretningsklasser, er det hensigtsmæssigt at lave et nyt lag der håndterer den slags, således at koden for åbne/lukke databasen etc. håndteres (og skrives) uafhængigt af dine forretningsklasser.

Principielt kunne du lave et meget generisk datalag sådan her:
public class Dal
{
  public DataRow[] GetDatabaseRows(string command)
  {
    // ...
  }
}

Hvor du så i alle dine forretningsklasser så skulle tage værdierne fra rækkerne, og instantiere de respektive objekter ud fra dem, hvilket igen var en type funktionalitet du kunne lægge for sig - således at det heller ikke ville komme til at "besudle" dine forretningsklasser.

Ah... kan se at arne sendte et par links... Alletiders :o)

Nå men anyway.... Det var også bare et par noter du måske kunne bruge til at komme igang på.

Mvh
Avatar billede dresen Nybegynder
18. juli 2006 - 00:14 #9
Hej snepnet og arne_v

Mange tak for jeres input.

Jeg håber det er ok at jeg holder tråden åben i lidt tid, så jeg kan få læst på tingene og derefter få stillet nogle ordentlige spørgsmål.

Det er super med de ting I har postet, nu skal jeg lige have det bearbejdet lidt.

mange tak! dresen
Avatar billede snepnet Nybegynder
18. juli 2006 - 09:09 #10
Det var så lidt :o)
Mvh
Avatar billede arne_v Ekspert
12. september 2006 - 00:00 #11
dresen>

Kommet videre ?
Avatar billede arne_v Ekspert
05. oktober 2006 - 03:16 #12
??
Avatar billede dresen Nybegynder
29. marts 2007 - 21:04 #13
Hej Arne og Snepnet

Tak for jeres informationer, de er stadig gode ved genlæsning. Har I anbefalinger til valg af OR-mappers.

smid et svar, så I kan få point.

/dresen
Avatar billede arne_v Ekspert
29. marts 2007 - 21:19 #14
der er masser

http://sharptoolbox.com/categories/object-relational-mappers

jeg vil foreslaa NHibernate

(LLBLGen har et saerdeles godt ry, men koster ogsaa penge mens NHibernate er gratis)
Avatar billede arne_v Ekspert
29. marts 2007 - 21:24 #15
og et svar
Avatar billede snepnet Nybegynder
29. marts 2007 - 22:14 #16
Jeg har selv benyttet gentle.net, med klasser genereret af mygeneration (begge er at finde på den side arne har linket til).
Det er gratis og glimrende.
Der findes også en 2.0 version af gentle, men det er ikke en final release.
Mvh
Avatar billede arne_v Ekspert
29. marts 2007 - 22:37 #17
Gentle.NET - er det den som er "dansk produceret" ?
Avatar billede snepnet Nybegynder
30. marts 2007 - 08:13 #18
Jeps - det er den, og den er bestemt produceret i Danmark.
Mvh
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