ZiBaT => Peter
Levinsky => SWD => exercise |
Hotel Opgave |
Opdated : 2018-02-12
|
Ide : At arbejde med en hotel database
Scandic hotel – kæde
Lav en domain model af Hotel-kæden.
Der er flere hoteller. Hvert hotel har flere værelser.
Hotellets kunder kan reservere et eller flere værelser.
Angiv attributter for klasserne og associeringer mellem klasserne.
Scandic hotel – kæde – fortsat
Beskriv klasser, attributter og associering som tabeller med primær nøgler, søjler og fremmed nøgler
Scandic hotel – kæde – fortsat
Undersøg om tabellerne er på 3NF
Scandic hotel – kæde – fortsat
De tabeller du har defineret og undersøgt i Trin 3, Opret dem som tabeller i databasen.
se (Fronter) evt: database-note kapitel 3 eller https://www.w3schools.com/sql/sql_create_table.asp
Inden du fortsætter skal du downloade og 'køre' disse to SQL-scripts
Når du indlæser og kører opret tabeller sql-script'et, så får du en database, som ser således ud:
Udarbejd et mindre dokument, der beskriver
søjlenavn (PK) | søjlenavn1 | søjlenavn2 | søjlenavn3 ... |
Lav en almindeligt Konsol-application.
Lav en klasse DBClient med en metode:
public void Start()
I main lav et object af DBClient og kald Start()-metoden.
I start metoden skal du kode en DB-forbindelse til din database og foretage forskellige SQL-kald.
Med hensyn til DB-Forbindelsen se nedenfor:
Hjælp se mere : SQLConnection
------------- generelt eksempel ----------------------
queryString => SQL-string eks: delete from Team where id = 44
connectionString => Connetion String til databasen se i egenskaber for databasen using (SqlConnection connection = new SqlConnection(connectionString)) {
SqlCommand command = new SqlCommand(queryString, connection);
command.Connection.Open();
command.ExecuteNonQuery();
}
-----------------------------------
Du skal hente alle hoteller fra din database (eller fra DemoHotel).
DVS. du skal lave en SQL-command select * from Hotel evt. fra DemoHotel
Når det er en select-sql-statement, så skal du benytte følgende i stedet for command.ExecuteNonQuery():
SqlDataReader reader = command.ExecuteReader();
Herefter kan du læse fra reader ved at skrive :
while (reader.Read())
{
int id = reader.GetInt32(0); -- læser int fra første søjle string name = reader.GetString(1); -- læser string fra anden søjle . . .
}
Du skal hent et hotel ud fra et hotel nummer.
select * from Hotel
where Hotel_No = xx
Du skal oprette og indsætte et hotel.
Insert into Hotel Values ( xx,yy,zz, ...)
Dette er ikke en select så her skal du benytte 'command.ExecuteNonQuery();'
Du skal slette et hotel med et specifikt nummer.
Delete from Hotel
where Hotel_No = xx
Du skal benytte 'command.ExecuteNonQuery();'
Du skal opdatere et hotel.
Update Hotel
set Hotel_No = xx, ...
NU er det tid til at lave en egentlig REST-Service. Til det skal du have model-klasser, en controller samt selve REST-servicen.
Du kommer til at arbejde med modelklasserne både på REST-Provider siden, såvel som på REST-consumer siden, derfor skal du lave dem i et Library (ddl-fil) der kan deles.
Du skal lave et projekt i VS2017 'Class Library (Legacy Portable)'.
Du skal implementere de 4 model klasser:
Husk at alle klassene skal være public, samt de skal have en default konstruktør.
Du må gerne tilføje (overload) endnu en konstruktør til initialisering. Typerne skal følge typerne i databasen.
Inden selve REST-servicen isolerer du kommunikationen med databasen i en eller rettere 4 controllere men start med 'Guest'.
Du skal lave et projekt i VS2017 under web 'ASP.NET Web Application (.NET Framework)' - klik ok til default valg af web api.
Du skal i solution lave en mappe 'DBUtil' til de 4 hjælpe controllere.
I mappen 'DBUtil' skal du lave følgende interface se IManageGuest.cs: Du kan evt bare kopiere fra filen.
Dernæst skal du implementere dette interface i klassen ManageGuest i mappen 'DBUtil'
Du skal lave meget af det sammen som i trin 7 bare for tabellen Guest (DemoGuest),
dvs. oprette DB-forbindelser (SQLConnection)
samt benytte de relevante SQL kommandoer (SQLCommand) altså select ..., insert ..., update .... og delete ....
Nu kommer du til selve REST-servicen.
Du skal i din solution finde mappem controllers, her skal du added (dvs. højre klik og add) en ny controller.
Du skal vælge 'Web API 2 controller with read/write actions' - kald din controller 'GuestController'.
Nu skal du tilpasse din REST-Service controller, den har de samme 5 metoder som ManageGuest.
'public IEnumerable<string> Get()' skal ændres til public 'IEnumerable<Guest> Get()' og du skal lave et object af din ManageGuest klasse og kalde GetAllGuest
'public string Get(int id)' skal ændres til 'public Guest Get(int id)' og på objectet af ManageGuest-klassen kalde GetGuestFromId
'public void Post([FromBody]string value)' ændres til 'public bool Post([FromBody]Guest value)' og benyt metoden CreateGuest
'public void Put(int id, [FromBody]string value)' ændres til 'public bool Put(int id, [FromBody]Guest value)' og benyt metoden UpdateGuest
'public void Delete(int id)' ændres til 'public Guest Delete(int id)' og benyt metoden DeleteGuest
Nu kan du køre din REST-Service:
Du skal nu starte fx. Fiddler4 (kan også være Postman), se semester plan for downloads.
Vælg fanen composer - her kan du opbygge og sende REST-Request til din REST-service.
Efter GET skriv din URL: fx. 'http://localhost:27481/API/Guest'. Du vil sikkert have et andet portnummer så erstat 27481 med DIT portnummer.
Prøv følgende REST-kald:
1) Get http://localhost:27481/API/Guest, se svaret
2) Get http://localhost:27481/API/Guest/4, se svaret (prøv med 444, som ikke findes)
3) Post http://localhost:27481/API/Guest -- OBS! Header Field indsæt 'Content-Type: application/json' + Boby noget der minder om '{"GuestNr":301,"Navn":"EtGodtNavn","Adresse":"EnFinVej"}'
4) Put http://localhost:27481/API/Guest/301 + Body noget der minder om '{"GuestNr":301,"Navn":"EtAndetNavn","Adresse":"EnNyVej"}'
5) Delete http://localhost:27481/API/Guest/301
Fint nu har du en REST service kørende for Guest
Lav tilsvarende REST-Servicer dvs. Controllere for Hotel, Room og Booking
Så Vink:
Ved Hotel Når et hotel skal hentes skal værrelser (rooms) til hotellet også hentes (fx. select * from DemoRoom where Hotel_No = xx, hvor xx er Nummer på hotellet)
Ved Booking skal et Hotel hhv. en Guest hentes udfra deres Nummer
Lav et DSD og et DCD for REST servicen
For at forstå designet af REST-service systemet (der bliver et support system (’supporting actor’)) skal du udarbejde et ’design’ Sekvens Disgram (SD) samt et Design Klasse Diagram (DCD).
Du skal lave et program der kan konsumere din REST-service.
Du skal lave et projekt i VS2017 'Console Application (.NET Framework)' kald det "HotelProgram".
Lav en klasse ConsumeRest med en metode:
public void Start()
I main lav et object af ConsumeRest og kald Start()-metoden.
Lav en metode HentAlleGæster() der returnere en liste af 'Guest', som skal kalde REST servicen, som henter alle gæster fra REST servicen.
--------------------------- Kode eksempel -------------------
String GuestUri = "http://resthotel-pele-easj.azurewebsites.net/api/Guest"; // din URL til din REST
using (HttpClient client = new HttpClient())
{
string jsonStr = client.GetStringAsync(GuestUri).Result; // info fra body
List<Guest> cList = JsonConvert.DeserializeObject<List<Guest>>(jsonStr);
return cList;
}
------------------------- SLUT --------------------------------
For at dette kan virke skal du tilføje to referencer:
1) Add reference til dit hotel library (højre klik på referencer og add 'sti til din dll-fil')
2) Tilføj et bibliotek til JsonConvert (højre klik på dit projekt og 'Manage NuGet Packages' browse efter json og vælg 'newtonsoft.json', der skal installeres)
Lav en ny metode HentEnGæst(int nr), der hent en gæst.
Det vil være tilsvarende del A, men tilpas URI med et nummer, samt Deserialize<Guest> ikke en hel liste.
Lav en ny metode IndsætGæst(Guest guest), der indsætter en gæst over REST.
I metoden skal du oprette et objekt af Guest (det opjekt der skal indsættes), Derefter skal du indkode det i json-format:
String json = JsonConvert.SerializeObject(guest);
Derefter skal du oprette den 'content' der skal sendes i body i dit HTTP-request.
StringContent content = new StringContent(json);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json")
Tilsidst sendes requestet
var resultMessage= client.PostAsync(GuestUri, content).Result;
.REST service svaret afkodes (dvs. HTTP response)
Du skal benytte noget svarende til dette:
-------------------------------- Kode eksempel ---------------
if (result.IsSuccessStatusCode)
{
string resultStr = result.Content.ReadAsStringAsync().Result;
bool res = JsonConvert.DeserializeObject<bool>(resultStr);
return res;
}
------------------------------------------------------------------
Lav en ny metoder OpdaterEnGæst(int nr, Guest guest), der opdaterer en gæst
Det vil være tilsvarende del C, men tilpas URI med et nummer serialiser Guest-objektet, samt Deserialize<bool>.
Lav en ny metoder SletGæst(int nr), der sletter gæst nummer 'nr'.
Det vil være tilsvarende del C, men tilpas URI med et nummer, samt Deserialize<Guest>.