Coproject – demo RIA aplikace krok za krokem, díl 2.
V tomto druhém díle (původní part 2) si připravíme serverovou stranu a zpřístupníme data do klientské části pomocí WCF RIA Services.
Domain model
V projektu Coproject.Web vytvořte novou složku “Models” a přidejte nový objekt typu ADO.NET Entity Data Model jménem CoprojectModel:
Otevře se průvodce, ve kterém si necháme vygenerovat model podle databáze (Generate from database), kterou jsme vytvořili v minulém díle (tj. pravděpodobně vyberete Database.mdf, případně nasměrujete VS na svou databázi na serveru). Nezapomeňte zaškrtnout, aby se connection string uložil do web.configu (Save entity connection settings in Web.Config) třeba pod názvem CoprojectEntities. Přejděte na další krok průvodce a naklikejte ho jako na následujícím obrázku:
Pak už stačí jen kliknout na Finish a počkat, až nám Visual Studio vygeneruje entitní model. Díky tomu je serverová část naší aplikace schopná přistupovat do databáze.
RIA Services
Dalším úkolem bude data ze serveru dále předat do klientské části aplikace běžící v Silverlightu. K tomu použijeme WCF RIA Services.
Vytvořte v projektu, kde jsme před chvílí přidali složku Models, další složku, tentokrát jménem “Services”. Do ní pak vložte nový objekt typu Domain Service Class pojmenovaný “CoprojectService”:
Opět se otevře průvodce, kterého nastavte podle obrázku:
Po kliknutí na OK by měly do projektu přibýt dva nové soubory:
První soubor (CoprojectServices.cs) obsahuje vlastní RIA Services webovou službu. Když se podíváte na její obsah, uvidíte funkce jako GetToDoItems, InsertToDoItem a podobně – jejich účel je, myslím, zřejmý.
Metadata
Zajímavější je druhý soubor jménem CoprojectService.metadata.cs, který obsahuje několik tříd podobné této:
internal sealed class ToDoListMetadata { // Metadata classes are not meant to be instantiated. private ToDoListMetadata() { } public DateTime CreatedDate { get; set; } public string Description { get; set; } public string Name { get; set; } public Nullable<int> ProjectID { get; set; } public EntityCollection<ToDoItem> ToDoItems { get; set; } public int ToDoListID { get; set; } public Nullable<DateTime> UpdatedDate { get; set; } }
Tato metadata slouží jako konfigurace RIA Services – určují, jaké entity mají být dostupné klientovi, které properties z něj, jak jsou mezi sebou entity propojené, přidávají informace o popiscích k jednotlivým properties a taky validační pravidla. Pojďme tedy přidat nějaká další metadata.
Nejprve přidejte atribut [Key] na properties ToDoItemMetadata.ToDoItemID, ToDoListMetadata.ToDoListID a UserMetadata.UserID. Tento atribut označuje primární klíče daných entit, které se používají například při odkazování mezi entitami (paralela s PK u relačních databází je jasná).
Pak přidejte další atributy do ToDoItemMetadata:
[Include] [Association("FK_ToDoItems_ToDoLists", "ToDoListID", "ToDoListID", IsForeignKey = true)] public ToDoList ToDoList; [Include] [Association("FK_ToDoItems_Users", "UserID", "UserID", IsForeignKey = true)] public User User;
Atribut [Association] definuje relace mezi entitami, atribut [Include] naopak říká RIA Services, že pokud je v této property nějaký objekt, má ho připojit k tomu, co posílá klientovi. Díky tomu je pak možno s jedním dotazem na ToDoItem dostat rovnou i nadřazený seznam ToDoList a přiřazeného uživatele.
Podobnou věc provedeme i pro ToDoListMetadata:
[Include] [Association("FK_ToDoItems_ToDoLists", "ToDoListID", "ToDoListID")] public EntityCollection<ToDoItem> ToDoItems;
Teď už stačí jen provést build celé solution a tím máme připravenou serverovou část řešení.
Komentáře