Caliburn.Micro ja Data Access

Aloin tekemään uutta sovellusta WP7:lle ja opetella samalla Caliburn.Micro alustan. Caliburn.Micro (tai CM) on Model-View-ViewModel kirjasto jonka avulla pitäisi olla helppo ohjelmoida ylläpidettäviä sovelluksia. Aiemmat versiot ovat tukeneet WPF:ää, Silverlight:ia ja WP7:aa mutta vasta uusin 1.3.0 versio tukee sitä kunnolla.

Ongelma tämän kertaisessa sovelluksessa on että mihin laittaa Data Access Layeri (eli DAL)? Sovellus hakee verkosta dataa joka pitää saada ensin ViewModeliin jotta View voi sen esittää.

Pikaisen googlauksen ja stackoverflown jälkeen vaikuttaa siltä että DAL saisi olla ihan oma luokkansa joka huolehtii Model:eista ja niiden tietojen päivittämisistä.

Microsoft on kirjoittanut dokumentaatiota kyseisestä ratkaisusta osoitteessa: http://waf.codeplex.com/ ja stackoverflowsta löytyi tämä linkki

 

Windows Phone 7 Popup

Windows Phonella on kätevä kontrolli jota voi käyttää tietojen esittämiseen sivun sisällön päällä. Eli kyse on Popup-kontrollista. Tappelin hetken tämän kanssa kunnes hoksasin kuinka sitä käytetään. Popup aukeaa sivulle kun sen IsOpen-ominaisuus muuttuu True-arvoon.

Ensin luodaan Visual Studiolla uusi Windows Phone projekti johon lisätään UserControl sekä halutulle sivulle Popup kontrolli.

Avaa Visual Studio ja File -> New Project -> New Windows Phone 7 project

Lisätään projektiin uusi UserControl. Klikkaa oikealla napilla Solutionin nimeä ja Add New Item -> User Control

Visual Studioon avaa UserControl:n. Lisää tähän haluamasi kontrollit. Textblockit ja napit yms. Yksi nappi on hyvä lisätä jotta Popup voidaan sulkea.

Kaksoisklikkaa nappia ja kirjoita taustakoodiin seuraava koodi. Koodi sulkee parent kontrollina olevan popupin.

private void button1_Click(object sender, RoutedEventArgs e)
{
    Popup popup = this.Parent as Popup;
    popup.IsOpen = false;
}

Avataan sitten ohjelman MainPage.xaml ja jotta UserControl olisi helppo lisätä sivulle niin lisätään XAML alkumäärittelyyn rivi joka viittaa ohjelman luokkakirjastoon.

    xmlns:local="clr-namespace:DemoApp2"

DemoApp2 tekstin tilalle tulee projektin nimi. Seuraavaksi lisätään Popup kontrolli sivun LayoutRoot-nimisen Gridin viimeiseksi / sisälle.

<Popup x:Name="ucPopup">
    <local:UserPopup > </local:UserPopup>
</Popup>

Tämän jälkeen kirjoitetaan koodi jolla Popup kontrolli saadaan näkyviin. Lisätään sivulle Button jonka taustakoodiin kirjoitetaan:

private void button1_Click(object sender, RoutedEventArgs e)
{
    ucPopup.IsOpen = true;
}

Asettamalla Popup kontrollin IsOpen Trueksi tulee Popup näkyviin. Koska Windows Phone 7 puhelimissa on takaisin nappi on oletettavaa että käyttäjä koittaa sitä käyttämällä navigoida pois popupista. Jotta tämä onnistuisi on meidän overridattava OnBackKeyPress funktio taustakoodissa.

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
    if (ucPopup.IsOpen)
    {
        ucPopup.IsOpen = false;
        e.Cancel = true; // cancel back navigation
    }

base.OnBackKeyPress(e);
}

Siinä se. Eikä ollut edes vaikea.

REST palvelut Silverlightiin Visual Studio 2010:llä

Tuli tarve kirjoittaa REST-tyylinen palvelu C#:lla ja Visual Studiolla. Case on seuraavanlainen, Silverlight-sovelluksesta pitää pystyä käyttämään REST-tyylistä palvelua.

Tehdään ihan perusratkaisu jossa palvelu vastaa “Terve, Kalle”.

Tehdään uusi projekti Visual Studiolla ja annetaan tässä projektin nimeksi “RestServicesProofOfConcept”.

new project

Ei kosketa uuden Silverlight-sovelluksen asetuksiin, ainoastaan Silverlight versio vaihdetaan versioksi 4.

silverlight1

Nyt meillä on Silverlight-sovelluksen luuranko johon lisätään REST-palvelu.

Lisätään web-projektiin uusi tiedosto, Add New Item (Ctrl+Shift+A)  valinnasta. Valitaan vasemmasta listasta ”Silverlight” ja oikeasta listasta ”Silverlight-enabled WCF service”. Annetaan tiedoston nimeksi ”RestService.svc”

Nyt meillä on REST-palvelun runko jossa on jo valmiina yksi metodi, ”DoWork”. Sitä voi testata painamalla F5 ja avaamalla restservice.svc osoitteen.

Lisätään nyt meidän oma REST-palvelu, avaamalla RestService.svc tiedosto. Tässä vaiheessa voit poistaa DoWork metodin tai kommentoida sen. Minä jätin kyseisen metodin paikalleen.

Aloitetaan lisäämällä referensseihin ”System.ServiceModel.Web”

ja lisätään sama using lauseisiin:

using System.ServiceModel.Web;

Alussa kirjoitin että palvelun pitäisi vastata ”Hello, Kalle” joten toteutetaan kyseinen metodi.

[OperationContract]
[WebGet(UriTemplate = "/Hello/{name}")]
public string Hello(string name)
{
return "Hello " + name;
}

UriTemplate määrittely kertoo mistä osoitteesta palveluun pääsee käsiksi, tässä tapauksessa ”/Hello/Kalle”. Jos koitat nyt avata palvelun osoitetta saat vastaukseksi HTTP 400, pyyntö ei kelpaa. Korjataanpa tämä avaamalla Web.config-tiedosto.

Web.config-tiedosto sisältää web-sovelluksen kaikki asetukset. Meidän palvelumme asetukset ovat jo täällä ja niitä muokkaamalla saamme palvelun toimimaan.

Lisätään behaviors-kohtaan seuraava koodi:

 <endpointBehaviors>
        <behavior name="webBehaviour">
          <webHttp/>
        </behavior>
      </endpointBehaviors>

Muutetaan meidän palvelumme asetuksia seuraavanlaisiksi:

<endpoint address=""
binding="webHttpBinding"
behaviorConfiguration="webBehaviour"
contract="RestServicesProofOfConcept.Web.RESTService" />

Avaamalla palvelun osoitteesta: localhost/restservice.svc/hello/kalle huomaat että palvelu palauttaa haluamamme vastauksen XML-muotoiltuna.

<?xml version="1.0"?>
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Hello kalle</string>

%d bloggaajaa tykkää tästä: