Hej! kan du inte skicka hela request.form & hela request.querystring? Båda är ju klasser så det är ju bara för funktionen att ta emot dem som parametrar... :) Hum. tackar, det kallar jag utförlig respons! Hej.Skicka data från presentationslager
Någon som har funderat kring bästa sättet att skicka data från presentationslager mot databas? Jag håller på med ett enkelt registerprogram med asp.net och vb som kodsyntax. Databasen är en SQL Server 2000, och jag vill helst placera så mycket kod som möjligt i ett mellanlager med vb-klasser.
Jag använder SqlClient.SqlCommand-klassens ExecuteNonQuery-metod för att exekvera t ex insert-satser med registrerat data från ett aspx-formulär. Jag vill helst inte bygga ihop min insert-sats i presentationslagret (aspx:en) utan i ett mellanlager i form av vb-klass, men hur bör jag i så fall skicka formulär-data från aspx till vb-klassen? Kan man använda querystrings eller måste jag bygga ett dataset i aspx:en? Andra förslag?
/henrik Sv: Skicka data från presentationslager
Sv: Skicka data från presentationslager
Detta kan du lösa på många olika sätt. Vad många utvecklare tyvärr gör fel med idag är att de kör en (RTC "Rush to code"), vilket gör att man då får svårigheter att bygga
upp sin applikations arkitektur m.m. Särkilt när det gäller ett OO baserat system eller 3 skiktat där man vill ha med delar som, återanvändbarhet, underhålsamhet etc...
Mitt tips till dig är att du försöker gå genom hur delar av din applikation skall fungera och därefter börja skissa upp samt bestämma hur dessa delar skall implementeras.
Ex Ditt registrerar formulär innehåller säkerligen Användaruppgifter? adressuppgifter? m.m. Och du kommer säkerligen återanvända både adressupgifter och användaruppgifter i din applikation på andra ställen?
Om så är fallet kan du i ditt problem ovan bygga entitetsklasser och hanteringar av dessa. Ex Address klass, User Klass. Till dessa kan du ex bygga Hanterar klasser, ex AddressHandler, UserHandler eller liknande som har metoder så som Get(),Save(),Update(),Delete(), Find() etc... och ha Dess specifika entiteter som inputparametrar m.m. Ex. AddressHandler.Save(Address)... Dessa klasser i sin tur kan använda andra klasser du kanske byggt upp för att underlätta din data Access så som En SqlManager eller vad som. (Gillar du att återanvända andras implementationer så har du MS Data Access Application Block:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/daab-rm.asp ) med klassen SqlHelper som mkt enkelt med få rader kod ser till så du kan utföra CRUD mot din SQL Server. Du kan även under BUS lagret skapa Fasad klasser m.m. exempvelvis en RegisterManager som kanske har metoder så som, SaveUser(), SaveAddress() som i sin tur använder dina två ovan Handlers.
På detta sätt får du en 3 skiktad lösning.
Web-Form(Pres) ---> RegisterHanlder (BUS) ---> SQLHelper(DAL) ---> SQL Server (DAL)
Web-Form: (PRES)
<code>
Address userAddress = new Address();
userAddress.Street = streetTextBox.Text;
userAddress.Phone = PhoneTextBox.Text;
...
User user = new User();
user.Name = nameTextBox.Text;
....
RegisterManager registerManager = new RegisterManager();
registerManager.SaveAddress(userAddress);
registerManager.SaveUser(user);
...
</code>
Class Bibliotek (BUS) Ex: RegisterManager
<code>
public void SaveAddress(Address address)
{
AddressHandler addressHandler = new AddressHandler();
addressHandler.Save(address);
}
public void SaveUser(User user)
{
UserHandler addressHandler = new UserHandler();
UserHandler.Save(user);
}
</code>
Class Bibliotek (BUS) Ex: AddressHandler
<code>
public void Save(Address address)
SqlHelper sqlHelper = new SQLHelper();
sqlHelper.Connstring.......
...
Skapa en Dynamisk SQL fråga genom att plocka ut värden ur Addrress entiteten, eller skapa parametar och kör med Stored Procedure
...
string Name = Address.Name;
...
sqlHelper.ExecuteNoQuery(sqlquery......)
</code>
Detta är bara ett exempel på hur man skulle kunna göra. Självklart kan din RegisterManager updatera redan befintlig information, eller hämta. Samma med AddressHandler som ex kan hämta en address baserad på id, namn eller vad man nu vill ha för kriterier, Spara, Updatera etc...
<code>
public class AddressHandler
{
public address Find(Address address)
{
...
Plocka ut satta värden från Address och bygg upp data för en Selct fråga
...
}
public address GetByID(int id)
{
...
}
public void SaveAddress(Address address)
{
...
}
public void UpdateAddress(Address address)
{
...
}
...
}
</code>
Du kan självklart göra det lättare för dig men då kan man missa massa fördelar (beror självklart på projektets syfte och mål.) genom att köra DataSets, ha färre klasser som gör fler saker men som då kan falla ur OO sammanhang och lätt bli funktions orienterade etc...
Beslutet hur man vill lägga upp sina lösningar och sin design beror mkt på _Hur_ det skall eller kan användas i din applikation. Du kanske inte alls behöver ha 3 skiktlösning om du har ett litet projekt som inte skall leva längre än 1 månad. etc...
Så det finns inget som säger vad rätt eller fel är.
//Johan NSv: Skicka data från presentationslager
Inga dumma tips, fast frågan är om jag orkar göra denna tillämpning fullständigt objektorienterad. Jag är mer ute efter att lära mig teknik, i form av ett litet registerprogram. I nuläget är det treskiktat med aspx-sidor, funktionsklasser ("kund", "kontakt" o.s.v som sparar, hämtar, tar bort) samt databas.
När du ger exempel på hur man kan bygga upp exempelvis spara-funktionaliteten i presentationsskiktet använder du properties för att hålla t ex adress, namn, och skickar dem sedan en och en för att sparas i databas. Det ger ju en helsikes massa slagningar mot databasen genom skikten, är det inte bättre att baka in allt data som hör ihop (namn, adress, telefon..) i tex en datarow eller dataset i presentationsskiktet och skicka hela klabbet mot databasen?
/henrik Sv: Skicka data från presentationslager
Var kanske inte så tydlig. :-)
Jag lägger bara datan i dessa Entiter, sedan plockar jag ut dem o skapar till min Insert eller Update sats eller vad jag nu vill göra med dem.
exempelvis:
<code>
SqlQuery = "INSERT INTO Address (Street,City....) VALUES ('" + Address.Street + "','" + Address.City +"'......)
</code>
Eller om du kör StoresProcedurer så gör du samma sak fast för parametrarna.
Vill du bara öva på att ta hand om tre skikt så kan du enkelt göra en BUS klass (icke 100% OO baserad) som tar hand om viktiga saker åt dig. Ex:
<code>
RegisterManager.SaveRegisterInfo(string Address,string Street, string user....)
...
</code>
Eller om du vill kan du ju skapa en RegisterFormEntitet klass:
<code>
.Street = teRegisterFormEntitetxtbox.text;
RegisterFormEntitet.Name = textbox.text;
RegisterFormEntitet.City = textbox.text;
...
RegisterManager.SaveRegisterInfo(RegisterFormEntitet);
</code>
Sedan i dina Save metoder plockar du ut datan antingen via ex 1 dess parametrar eller som i tidigare ex via entiteten.
Tänk på att om du gör som i ex 1 och behöver spara nya värden så måste du spräcka interfacet för att kunna lägga till en extra parameter det måste du inte i ex 2, där behöver du bara skapa ett till attribut i din entitesklass och i alogritmen plocka ut detta, på så vis bryts inte interfacet för din Save metod.
Eller så kan du helt enkelt skapa upp en DataTable och skicka in den till ditt BUS lager för hantering.
Web-Form (Pres-Lager) <-- Här gör du allt som har med presentationen att göra. Ex hantering av kontrollerna, hur data skall ritas upp.
klasser (BUS-Lager) <-- Här tar du emot data från Pres-Lager och hanterar dem, eller skickar data till pres lagret för visning, ex ett DataSet, DataReader...
DataBas (DATA-Lager) <--- Databashanterare, CRUD hantering.
//Johan N