W poprzednim poście opisałem wrzucenie projektu WebApi na hosting Webio. Samo API było bardzo proste i zwracało jedynie zahardkodowane wartości przykładowych zdarzeń. Dzisiaj opiszę kolejne ćwiczenie z hostingiem Webio. Dodałem serwer bazy danych MS SQL Server 2012 oraz zmodyfikowałem API, aby zdarzenia pobierały i zapisywały się dynamicznie do bazy danych. Proces ten przebiegł równie sprawnie jak poprzedni.
1. Nowa baza danych w Webio
Aby dodać nowy serwer bazy danych przeszedłem do: “Bazy danych” > “SQL Server 2012″. Tam wybrałem “Utwórz bazę danych”, po czym wpisałem jej nazwę. Po kliknięciu na “Zapisz” została ona stworzona. W polu “Zewnętrzny serwer” znajduje się informacja na jaki adres należy się połączyć, aby korzystać z bazy w aplikacji. Należało jeszcze dodać użytkownika. Czyli podobnie: “Bazy danych” > “SQL Server 2012″ > “Utwórz użytkownika”. Wpisałem jego nazwę i hasło oraz wybrałem domyślną bazę danych stworzoną wcześniej. W ten sposób stworzyłem bazę danych dla moich aplikacji.
2. Nowa tabela w bazie z Visual Studio
Następnie stworzyłem prostą tabelkę do przechowywania zdarzeń. W Visual Studio w “Tools” > “Connect to Database” skonfigurowałem połączenie zgodnie z danymi ustawionymi w panelu Webio i dodałem połączenie do moich Data Connections. Potem prawym na “Tables” i “Add New Table”. Na poniższym obrazku widać jak prostą tabelkę stworzyłem. Zawiera ona tylko “Id” i “Name”. Po kliknięciu na “Update” została utworzona na serwerze w hostingu Webio.

3. Uaktualnienie WebApi
Postanowiłem w projekcie użyć mikro ORMa Simple.Data. Operuje on na dynamicach i oferuje dużo szybsze wykonywanie zapytań do bazy niż np. Entity Framework. Myślę że do tak prostego zastosowania jak mój projekt nadaje się idealnie. Jest dostępny jako paczka nugetowa: Simple.Data.SqlServer (z zależnościami). Zmieniłem też kod serwisu, aby korzystał z właśnie stworzonej bazy danych.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
public class EventsService : IEventsService { private dynamic OpenDatabase() { return Database.OpenNamedConnection(Constants.Config.WebioDatabaseConnectionString); } public List<Event> GetAllEvents() { return OpenDatabase().SmartLodowka_Events.All(); } public Event GetEvent(int id) { return OpenDatabase().SmartLodowka_Events.FindById(Id: id); } public List<Event> InsertEvents(List<Event> newEvents) { return OpenDatabase().SmartLodowka_Events.Insert(newEvents); } } |
Na koniec poprawiłem kontroler, aby był bardziej RESTful friendly.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
public class EventsController : ApiController { private readonly IEventsService _service; public EventsController() { _service = new EventsService(); } public IHttpActionResult Get() { return Ok(_service.GetAllEvents()); } public IHttpActionResult Get(int id) { var tmp = _service.GetEvent(id); if(tmp == null) { return NotFound(); } return Ok(tmp); } public IHttpActionResult Post(CreateEventsRequest request) { if(ModelState.IsValid == false) { return BadRequest(ModelState); } return Ok(_service.InsertEvents(request.Events)); } } |
4. ConnectionString w web.config
Jako, że projekt “Smart Lodówka” jest open sourcowy cały kod dostępny jest na GitHubie. Ale nie chcę tam wrzucać loginów i haseł, w tym przypadku do mojej prywatnej bazy danych. Zrobiłem więc nowy plik o nazwie “connectionStrings.config”, który zawiera tylko sekcję z danymi połączeń:
|
<connectionStrings> <add name="WebioDatabaseConnectionString" connectionString="Server=<WEBIO_SERVER>;Database=<WEBIO_DATABASE>;Uid=<WEBIO_DB_USER>;Password=<WEBIO_DB_PWD>;"/> </connectionStrings> |
A w samym web.configu podałem go w “configSource”.
|
<configuration> <connectionStrings configSource="connectionStrings.config"/> ... </configuration> |
Plik “connectionStrings.config” mogłem dodać do ignorowanych przez Git, dzięki temu nie znajdzie się on w publicznym repozytorium.
Do testowania WebApi używam dodatku do Chroma: Advanced REST client. Jest bardzo wygodny i polecam go każdemu. Zapewne napiszę o nim więcej w oddzielnym poście bo ma sporo ciekawych funkcji.
C.
Like this:
Like Loading...
2 Comments
“Operuje on na dynamicach i oferuje dużo szybsze wykonywanie zapytań do bazy niż np. Entity Framework.” – testowałeś jakoś szybkość tych zapytań? Bo trochę wątpię w szybsze generowanie zapytań przy użyciu czegoś tak wolnego jak dynamic. Za to na pewno w SimpleData można szybciej napisać kod.
Cześć, dzięki za komentarz. Słuszna uwaga. Trochę niedokładnie się wyraziłem. Miałem na myśli to, że EF jest dużą biblioteką z wieloma funkcjami, bez których będę mógł się obejść w tak prostym projekcie. A rozgrzanie EF potrafi zająć i z 10s chociaż potem zapytania są już w milisekundach. SimpleData ma dynamici, ale subiektywne odczucie jest lepsze niż EF. Chociaż tak jak piszę, wrażenie jest czysto subiektywne. Pomyślę o zrobieniu jakiegoś benchmarka :)