
DB מוגן עם get בלבד. היא מממשת IDisposable ומשחררת את אובייקט הדאטאבייס בתוך Dispose.using, במקום לגשת לדאטאבייס ישירות. מחרוזת החיבור חייבת להיות ב-Web.config של האתר, ולא רק ב-App.config של ה-DLL.הטקסט המלא של הדקות הראשונות בהרצאה «שימוש במודל השכבות - N-Tiers» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
הדבר הבא שאנחנו הולכים לראות זה עבודה נכונה עם דאטאבייס במודל שכבות. למה חשוב לנו לדעת את זה? כי כאשר אנחנו בונים מערכת, בדרך כלל אנחנו נרצה שלא רק אתר אחד יתחבר אליה.
יכול להיות שיש לנו גם איזשהו סרוויס, כמו WCF או Web Service שמתחבר לדאטאבייס שלנו. יכול להיות שהאתר שלנו מאוד גדול, יכול להיות שיש גם אפליקציית ווינפורם או WPF שניגשת לדאטאבייס שלנו, ובכלל לא כדאי לקחת את כל מה שקשור לדאטאבייס ולשים אותו בתוך הפרויקט mvc.
אז אנחנו הולכים עכשיו לראות איך לחלק את המערכת לחלקים. אז בעצם לכל המערכת כולה יש שלושה חלקים. חלק אחד זה הדאטאבייס עצמו, שם יושבות ה-Stored Procedures, הטבלאות, הכישורים בין הטבלאות, פונקציות ואולי עוד כל מיני דברים כמו Views שזה מבט על טבלה, או טריגרים שזה בעצם פעולות שניתן לבצע כאשר מבצעים insert, update או delete.
זה חלק אחד וזאתי שכבה נפרדת של המערכת. הדבר הזה כבר יש לנו כאן. הדבר השני שיש לנו זה האתר mvc. פרויקט mvc מכיל את הקונטרולר, את הדפים עצמם, את ה-views וחלק מהמודל שאנחנו ראינו כאן של החלקים של ה-partial.
אבל מה שהמודל לא צריך להכיל בתוך הפרויקט של ה-mvc שלנו ואת כל התקשורת עם הדאטאבייס, מה שראינו כאן, את כל שאילתות ה-SQL, את כל הפנייה לדאטאבייס ואת התצורה של כל המחלקות הללו.
כל הדברים האלה צריכים לשבת בפרויקט נפרד, ועכשיו אנחנו הולכים לראות איך בדיוק להרים מערכת כזאת. אז הדבר הראשון שאנחנו הולכים לבצע זה להוסיף לסלושן פרויקט נוסף.
יש לנו פה את הסלושן, כרגע אנחנו רואים שיש בו one project, שזה הפרויקט של אתר ה-MVC שלנו. אנחנו הולכים ללחוץ מקשימני על הסלושן, לבצע add new project ולבחור מתוך c-sharp ב-class library.
זה בעצם פרויקט dll ואנחנו רואים שהפרויקט הזה מתווסף לתיקייה של הסלושן. בואו נקרא לו business logic. זה שם מאוד ידוע שמומלץ לתת למערכות שניגשות לדאטאבייס.
בדרך כלל זה dll שפשוט מאוד מכיל את כל הפניות לדאטאבייס וצריך להיות בנוי בצורה מאוד מאוד ספציפית. אז יש לנו פה את הפרויקט הזה, בואו נוסיף אותו.
וכעת יש לנו שני פרויקטים בתוך ה-Solution, יש לנו את ה-Business Logic, ויש לנו את הפרויקט של MVC שקראתי לו N-Tiers. דבר ראשון, יש לנו פה איזושהי מחלקה, אנחנו הולכים לשנות את השם שלה ל-Base Logic.
זאת מחלקת בסיס שכל מחלקות הלוגיקה שפונות לדאטאבייס הולכות לרשת מה-Base Logic. כל המחלקות בתוך ה-DLL שאנחנו רוצים לגשת אליהן מחוץ הדי-אל-אל חייבות להיות מוגדרות כפאבליק ולכן גם המחלקה הזאת היא פאבליק.
הדבר הבא שאנחנו צריכים לבצע זה להוסיף ל-Business Logic את ה-Entity Framework. אנחנו הולכים ל-Add New Item, בוחרים מתוך Data ADO.NET Entity Data Model ומגדירים לו את השם Northwind.
זאת אומרת ש-Entity Framework לא הולכת להיות כמעט אף פעם כחלק מאתר ה-MVC אלא הולכת להיות ב-DLN נפרד וכך זה יהיה הרבה יותר מובנה והרבה יותר מודולרי.
נבצע Add, נבחר Generate From Database, נתממשק לאותו מסד נתונים, נביא את כל הטבלאות ואת כל ה-Stored Procedures, Finish, וכעת אנחנו יכולים לראות שהתווסף לנו לתוך פרויקט ה-DLL כל המערכת של Entity Framework.
אנחנו יכולים לראות שזה נמצא כאן. כעת כל מה שאנחנו צריכים לעשות זה לבנות את כל הפעילויות הדרושות לאפליקציה מתוך ה-Business Logic.
דבר ראשון, בתוך ה-Base Logic, זאת מחלקת הבסיס שכל המחלקות בביזנס לוג'יק יורשות אותה. אנחנו צריכים להגדיר את אותו אובייקט של אנטיטי פריימורק שמסוגל לבצע את הפעולות על הדאטאבייס.
אז נגדיר כאן משתנה פרייבט מסוג Northwind Entities נקרא לו underline db, ניצור אובייקט חדש ממנו וניצור משתנה מסוג Northwind Entities נקרא לו db באותיות גדולות אבל הדבר הזה הוא פרופרטי שיש לו גט בלבד, מחזיר לנו את ה-DB והוא מוגדר כ-protected בכדי שרק מחלקות יורשות את ה-base logic יוכלו לגשת אליו וכמובן גם ניתן לגשת
מתוך ה-base logic ל-DB. הדבר הבא שאנחנו צריכים לעשות זה לרשת את ה-interface i-disposable לממש אותו ובפונקציה dispose לקרוא ל-dispose של אובייקט הדאטאבייס.
כך מי שמשתמש ב-base logic יוכל בעצמו לקרוא ל-dispose ולשחרר משאבים. המשאבים יישארו פתוחים אפשר להיפטר מכל מרחבי השמות שיש פה ויש לנו כרגע את הבייס לוג'יק מוכן עכשיו אנחנו צריכים ללכת ולכתוב מחלקה נפרדת עבור כל אזור נפרד בדאטה בייס אם יש לנו בדאטה בייס את המחלקה או יותר נכון את הטבלה פרודקטס אנחנו כנראה רוצים לעשות
הרבה פעולות על פרודקטס כל הפעולות שמתבצעות על פרודקטס צריכות להיות בתוך מחלקה נפרדת קלאס שנקרא כנראה פרודקטס לוג'יק והוא מכיל את כל הלוגיקה בנוגע למוצרים.
אם יש לנו לדוגמה איזושהי טבלה שמתארת עובדים וטבלה שמתארת טלפונים של עובדים, אז אנחנו כנראה לא נצטרך שתי מחלקות, אנחנו נצטרך מחלקה אחת שמטפלת בעובדים וגם בטלפונים שלהם, כי זה די קשור אחד לשני.
אבל בוודאות תהיה לנו מחלקה נפרדת עבור עובדים ומחלקה נפרדת עבור מוצרים. אז מה שאנחנו צריכים לעשות זה לחזור ל-Business Logic, לצרף עוד קלאס, נקרא לה Products Logic, נגדיר את הקלאס הזאת כפאבליק בכדי שניתן יהיה
לגשת אליה מחוץ ל-DLL וכמובן היא הולכת לרשת את ה-BasedLogic. כאן בתוך המחלקה הזאת אנחנו הולכים לבנות את כל הפעילויות שאנחנו רוצים לבצע עבור כל המוצרים.
נתחיל עם בחירת כל המוצרים. אז יש לנו כאן פונקציה והיא מחזירה לנו ליסט של פרודקט, נקרא לה getProducts, היא לא תקבל כלום והיא הולכת להחזיר לנו את כל המוצרים.
אז כל מה שאנחנו צריכים לעשות זה להחזיר את db, שימו לב שיש לנו פה את db כי הוא פרוטקטד וניתן לגשת אליו עם החלקות ירשות נקודה products.tool list סיימנו לבנות את הפונקציה הראשונה יש לנו עוד ארבע פונקציות יש לנו פונקציה שמחזירה product אחד get product היא מקבלת product id ומחזירה לנו מוצר אחד ויחיד אז כל מה שאנחנו צריכים לעשות זה return db.first or default או
יותר נכון Products, פרודקטסטור דיפולט, ניתן איזשהו מוצר ונאתר רק את המוצר שהפרודקט איי-די שלו שווה לפרודקט איי-די שהתקבל לפונקציה.
איזשהו כלל אצבע מאוד חשוב, השמות של המשתנים הם מאוד מאוד חשובים. מה שקורה זה שבמסד הנתונים קודם כל הוגדרה עמודה שנקראת Product ID. בגלל שהיא הוגדרה כפרודקט ID בשם הזה, אז אוטומטית אנטיטי פריימורק יוצרת את המאפיין product ID שזהה לשם של העמודה.
לכן אנחנו צריכים לשמור על השם הזה ואם יש לי משתנה שנקרא product ID שאני מקבל אותו לפונקציה אז אני חייב לשמור על אותה מוסכמה. זה בעצם שומר שאני לא אעשה טעויות בהמשך וגם מי שמשתמש בפונקציה יודע שהוא צריך להעביר product ID ולא סתם ID כללי כלשהו.
הפונקציה הבאה בתור שאנחנו הולכים לכתוב מחזירה void ונקראת add product. ממש כל הפעילויות שאנחנו רוצים לבצע באתר שלנו, כל פעילות כזאת הולכת להתכתב על ידי פונקציה שיושבת בביזנס לוג'יק.
Add product הולכת לקבל את הפרמטרים של מוצר אחד ויחיד, או הולכת לקבל גם product, היא יכולה ממש לקבל product אמיתי,