מדריך Windows Azure – שימוש ב Table Storage
יצירת Data Model ב Table Storage
במדריך הקודם יצרנו את פרויקט הענן הראשון שלנו ב Visual studio 2010. במשימה זו ניצור Data Model ב Table Storage על מנת שנוכל לשמור ולהעביר את הנתונים של ספר האורחים בין ה Roles השונים.
האפליקציה אמורה לשמור את הערכים של של ה- Gust book בTable Storage. ה- table Storage מאפשר לנו לשמור רשומות (ישויות) בצורה טבלאית, כל רשומה מכילה RowKey ו PartitionKey. שילוב של המאפיינים האלה יוצר מפתח חד ערכי עבור כל רשומה (יישות). בנוסף, לכל רשומה יש TimeStamp על נת לעקוב אחרי שינויים בצורה מסודרת (תאריך השינוי נשמר).
יש לנו The Table Storage client API שחושף לנו מחלקה בשם TableServiceEntity שמייצגת רשומה ב Table service. ניתן לשמור אובייקט סוג זה ב Table Storage או אובייקט שיורש ממנו.
ה Table service client API מותאם ל REST API שמסופק על ידי Wcf Data Services (בעבר השם שלו היה ADO.NET Data Services).
ה Table Storage שונה ממה שאנחנו מכירים בתור טבלת נתונים. ה- Table Storage לא אוכף שום סכמה עבור הנתונים כך שאין לנו שום בעיה להחזיק 2 ישיויות שונות באותו טבלה, במקרה שלנו יש סכמה קבועה של נתונים שנרצה לשמור.
על מנת להתשתמש בClient library WCF Data Services יש צורך ליצור מחלקה חדשה שיורשת מ TableServiceContext, שהוא בעצמו יורש מ DataServiceContext . ה- API מאפשר לנו הגדרה של טבלאות לפי הצורך. על מנת להשתמש באפשרות זו עלינו להגדיר Property עבור כל טבלה בצורה הבאה : IQueryable<SchemaClass> , כאשר ה- SchemaClass מייצג את מבנה הנתונים.
במדריך זו יש ליצור Context משלנו ויש להגדיר מחלקה שתייצג רשומה בספר האורחים. נגדיר את המחלקה בצורה כזו שתתאים לכל ה- Data bound controls ב ASP.NET.
- יש להוסיף Class library שבו נגדיר את המחלקות. באמצעות תפריט File יש לבחור Add ו new Project.
- במסך "Add new project" יש לבחור Class library מתוך ה- Installed Templates ולהגדיר ששם הפרויקט הוא GuestBook_Data. את מיקום הפרויקט יש להשאיר איך שהוא וללחוץ על OK
- כאשר יוצרים פרויקט מסוג Class library הוא יוצר כברירת מחדל מחלקה בשם Class1, יש למחוק את המחלקה, קליק ימני על המחלקה בSolution explorer ו Delete ולאשר.
- יש להוסיף Reference ל WCF Data Services. קליק ימני על הפרויקט (GuestBook_Data ) ולבחור Add Reference. במסך שנפתח יש לבחור את ה- Tab של .Net ומשם לבחור את System.Data.Services.Client .
- חזרו על צעד זה שוב עבור ה- Reference – Microsoft.WindowsAzure.StorageClient.
- יש ליצור מחלקה המייצגת את מבנה הנתונים. על מנת להוסיף מחלקה, קליק ימני על הפרויקט, Add ו Class
שנו את שם המחלקה ל GuestBookEntry.cs ולחצו על Add.
- בראש המחלקה יש להוסיף using על מנת שיהיה לנו נוח לעבוד עם ה- References שהוספנו. יש להוסיף תחילה משפט using עבור Microsoft.WindowsAzure.StorageClient .
using Microsoft.WindowsAzure.StorageClient
אם המחלקה לא פתוחה, פתחו אותה, יש להגדיר את המחלקה כ public ולרשת מ TableServiceEntity. התשמשו בקוד הבא :
public class GuestBookEntry :
Microsoft.WindowsAzure.StorageClient.TableServiceEntity
{
}
תזכורת : TableServiceEntity מייצג יישות. הוא מכיל RowKey ו PartitionKey שביחד הם בונים את DataServiceKey , מפתח חד ערכי ייחודי בכל Table.
- יש להוסיף לבנאי ברירת המחדל (default constructor) את קוד ההשמה ל RowKey ו PartitionKey.
public GuestBookEntry()
{
PartitionKey = DateTime.UtcNow.ToString("MMddyyyy");
// המאפיין מאפשר לנו לבצע מיון לכן אנחנו דואגים שהשורות יחזרו לפי //זמן
RowKey = string.Format("{0:10}_{1}", DateTime.MaxValue.Ticks - DateTime.Now.Ticks, Guid.NewGuid());
}
- יש להגדיר את השדות הנוספים שאנחנו רוצים במחלקה, Message, GuestName,PhotoUrl, and ThumbnailUrl .
public string Message { get; set; }
public string GuestName { get; set; }
public string PhotoUrl { get; set; }
public string ThumbnailUrl { get; set; }
- שמרו את המחלקה GuestBookEntry.
- מחלקה הנוספת שאנחנו צריכים ליצור זו מחלקה שתשמש כשירות. מחלקה כזו צריכה לרשת מ TableServiceContext. בדומה להוספת המחלקה הקודמת יש לחזור על התהליך ולהוסיף מחלקה בשם GuestBookDataContext.cs או GuestBookDataContext.vb בהתאם לשפת הכתיבה שלכם.
- במחלקה החדשה יש להגדיר את ההורשה מ TableServiceContext בצורה הבאה :
public class GuestBookDataContext
: Microsoft.WindowsAzure.StorageClient.TableServiceContext
{
}
כעת יש להוסיף Default constructor שמאתחל את מחלקת האב (Base class) בנתונים של ה- Storage Account.
public class GuestBookDataContext
: Microsoft.WindowsAzure.StorageClient.TableServiceContext
{
public GuestBookDataContext(string baseAddress, Microsoft.WindowsAzure.StorageCredentials credentials)
: base(baseAddress, credentials)
{ }
}
חשוב לדעת :
המחלקה TableServiceContext יורשת מ WCF Data Service ומנהלת עבורנו את האישורים המתאימים לחיבור אל הStorage account.
- כעת יש להוסיף מאפיין שייצג את טבלת האורחים (באמצעות המחלקה GuestBookEntry).
public class GuestBookDataContext
: Microsoft.WindowsAzure.StorageClient.TableServiceContext
{
...
public IQueryable<GuestBookEntry> GuestBookEntry
{
get
{
return this.CreateQuery<GuestBookEntry>("GuestBookEntry");
}
}
}
חשוב לדעת :
ניתן להשתמש בפונקציה CreateTablesFromModel שנמצאת במחלקה CloudTableClient על מנת ליצור טבלאות נדרשות באפליקציה. כאשר אנו יורשים מ TableServiceContextכל מאפיין שאנו מגדירים בצורה IQueryable זו הפונקציה שמופעלת מאחורי הקלעים.
- לסיום, יש ליצור אובייקט שנוכל לבצע לו Bound לפקדי המידע של ASP.NET (GridView, DetailsView, DataList ועוד). על מנת לבצע זאת יש להוסיף מחלקה חדשה, קליק ימני על הפרויקט ב Solution Explorer ו Add new Item. במסך שנפתח יש להוסיך מחלקה בשם GuestBookDataSource, שנו את השם ולחצו על Add.
- במחלקה שנוצרה יש להוסיף את הNamespaces הבאים :
- יש להגדיר את השדות של ה- context וה StorageAccount בצורה הבאה :
- כעת, יש להוסיף בנאי סטטי (Static constructor). בבנאי זה ניצור טבלה מהGuestBookDataContext , יש להשתמש בקוד הבא :
public class GuestBookDataSource
{
//...
static GuestBookDataSource()
{
StorageAccount =
CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
CloudTableClient.CreateTablesFromModel(
typeof(GuestBookDataContext),
StorageAccount.TableEndpoint.AbsoluteUri,
StorageAccount.Credentials);
}
}
הstatic Constructor מבצע איתחול ל Storage account על ידי קריאה של ההגדרות מקבצי הקונפיגורציה והפעלת הפונקציה CreateTablesFromModel שיושבת בתוך במחלקה CloudTableClient . על ידי שימוש ב Static constrctor אנחנו מבטיחים שקוד זה יופעל פעם אחת בלבד.
- הוסף בנאי ברירת מחדל (Default constructor) למחלקה GuestBookDataSource על מנת לאתחל את ה- Data context שמסייע לנו לגשת לטבלה ב Storage.
public class GuestBookDataSource
{
...
public GuestBookDataSource()
{
this.context = new GuestBookDataContext(StorageAccount.TableEndpoint.AbsoluteUri, StorageAccount.Credentials);
this.context.RetryPolicy = RetryPolicies.Retry(3, TimeSpan.FromSeconds(1));
}
}
- כעת יש להוסיף את הפונקציה הבאה על מנת להחזיר את התוכן של הטבלה (GuestBookEntry).
public class GuestBookDataSource
{
//...
public IEnumerable<GuestBookEntry> GetGuestBookEntries()
{
var results = from g in this.context.GuestBookEntry
where g.PartitionKey == DateTime.UtcNow.ToString("MMddyyyy")
select g;
return results;
}
}
הפונקציה GetGuestBookEntries מחזירה את הרשומות החדשות שהוכנסו באותו יום למערכת. היא מבצעת את זה באמצעות LINQ ומסננת לפי התאריך והערך של ה- partition key .
- כעת יש לכתוב את הקוד הבא שתפקידו להוסיף רשומה חדשה לספר האורחים :
public void AddGuestBookEntry(GuestBookEntry newItem)
{
this.context.AddObject("GuestBookEntry", newItem);
this.context.SaveChanges();
}
- הפונקציה מוסיפה אובייקט חדש מסוג GuestBookEntry אל ה- Context ומפעילה את הפונקציה SaveChanges על מנת לשמור את הנתונים.
- כעת יש להוסיף פונקציה שמאפשרת עדכון של כתובת התמונה הקטנה (thumbnail ) ברשומה בספר האורחים.
- הפונקציה מקבלת את הרשומה לפי המפתח, מעדכנת ברשומה את כתובת ה- thumbnail מפעילה את הפונקציה UpdateObject של ה- שמסמנת לcontext האובייקט עודכן ושומרת את השינויים באמצעות SaveChanges
- שמרו את הקובץ GuestBookDataSource.cs
במדריך הבא נעסוק בבניית Web Role ב ASP.NET שישמש כממשק המשתמש המאפשר הוספה והסרה של רשומות לספר האורחים.
תגובות בפייסבוק