PracticU

שימוש במודל השכבות - N-Tiers

בלי כתוביותעם כתוביות
PracticU › קורס MVC › שימוש במודל השכבות - N-Tiers
מילון מושגים:
מודל - רכיב שמייצג את הנתונים ואת הלוגיקה העסקית באפליקציה. גם ייצוג מופשט של מערכת או תהליך.
MVC - דפוס ארכיטקטורה שמפריד יישום לשלושה חלקים: מודל (נתונים), תצוגה (View) ובקר (Controller).
ספרייה - אוסף קוד מוכן, כמו פונקציות ומחלקות, שמפתחים משתמשים בו בתוכניותיהם במקום לכתוב הכול מחדש.
Entity Framework - ספריית מיקרוסופט שממפה בין אובייקטים בקוד לבין טבלאות במסד נתונים, ומאפשרת לעבוד עם הנתונים בלי לכתוב SQL ישיר.
פריימוורק - מסגרת תוכנה שמספקת מבנה וכלים מוכנים לפיתוח יישומים, כדי לחסוך כתיבת קוד חוזר.
ADO.NET - אוסף מחלקות ב-.NET לגישה למסדי נתונים, להרצת שאילתות ולעבודה עם התוצאות.
Northwind - מסד נתונים לדוגמה של מיקרוסופט, המדמה חברת מסחר ומשמש ללימוד ולהדגמת שאילתות SQL.
DLL - קובץ ספרייה ב-Windows המכיל קוד ופונקציות שתוכנות שונות יכולות לטעון ולהשתמש בהן במשותף.

שימוש במודל השכבות - N-Tiers
כשבונים מערכת שמתחברת לדאטאבייס, לא רוצים שכל הגישה לנתונים תישב בתוך פרויקט האתר. לכן מחלקים את המערכת לשכבות: הדאטאבייס, פרויקט לוגיקה נפרד, והאתר.
השלבים העיקריים
1. שלוש שכבות: הדאטאבייס (טבלאות, Stored Procedures, Views, טריגרים), פרויקט הלוגיקה, והאתר עצמו (MVC עם controllers, views ו-models לתצוגה).
2. פרויקט Business Logic: מוסיפים ל-Solution פרויקט מסוג Class Library. מחלקת הבסיס BaseLogic היא public, וכל מחלקות הלוגיקה יורשות ממנה.
3. Entity Framework: מוסיפים לפרויקט מודל ADO.NET Entity Data Model בשם Northwind, ובוחרים Generate From Database עם כל הטבלאות וה-Stored Procedures.
4. מחלקת הבסיס: BaseLogic מחזיקה אובייקט NorthwindEntities בשדה פרטי, וחושפת אותו דרך פרופרטי DB מוגן עם get בלבד. היא מממשת IDisposable ומשחררת את אובייקט הדאטאבייס בתוך Dispose.
5. מחלקה לכל אזור בדאטאבייס: לכל טבלה, או קבוצה של טבלאות קשורות, נכתבת מחלקה נפרדת. למשל ProductsLogic, עם GetProducts, GetProduct לפי ProductID, AddProduct, UpdateProduct ו-DeleteProduct.
6. חיבור לאתר: מוסיפים הפניה ל-DLL, ומשתמשים במחלקות דרך using, במקום לגשת לדאטאבייס ישירות. מחרוזת החיבור חייבת להיות ב-Web.config של האתר, ולא רק ב-App.config של ה-DLL.
טעויות נפוצות
- שמות המאפיינים שהמודל יוצר נלקחים משמות העמודות בטבלה, ולכן יש לשמור על השמות האלה, למשל ProductID.
- אם יש מחלקה בשם Product גם במודל וגם בפרויקט הלוגיקה, נוצרת התנגשות (ambiguous reference). צריך ליישר את מרחבי השמות.
- אחרי שהמודל עבר לפרויקט הלוגיקה, ה-views שמתייחסים למודל צריכים להתעדכן למרחב השמות החדש.
שימו לב
המבנה הזה מאפשר לאתר MVC ולמערכות נוספות להשתמש באותה לוגיקה בלי לשכפל קוד.
השיעור הבא בקורס: שימוש בתבניות מוכנות - Scaffold
מילון מושגים:
קוד מקור - הקוד שמפתחים כותבים בשפת תכנות, לפני הידור, המגדיר את פעולת התוכנה.
MVC - דפוס ארכיטקטורה שמפריד יישום לשלושה חלקים: מודל (נתונים), תצוגה (View) ובקר (Controller).

להורדת קוד מקור של כל הדוגמאות בקורס MVC – לחץ כאן


פרקי ההרצאה: שימוש במודל השכבות - N-Tiers

  1. 00:00

    למה להפריד את הגישה ל-Database

  2. 00:39

    שלוש השכבות של המערכת

  3. 01:37

    פרויקט Class Library בשם BusinessLogic

  4. 02:49

    מחלקת BaseLogic ו-Entity Framework

  5. 04:21

    אובייקט Entities מוגן ב-BaseLogic

  6. 05:15

    מימוש IDisposable

  7. 05:50

    מחלקת ProductsLogic

  8. 07:03

    הפונקציות GetProducts ו-GetProduct

תמלול ההרצאה: שימוש במודל השכבות - N-Tiers

הטקסט המלא של הדקות הראשונות בהרצאה «שימוש במודל השכבות - N-Tiers» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:00

    הדבר הבא שאנחנו הולכים לראות זה עבודה נכונה עם דאטאבייס במודל שכבות. למה חשוב לנו לדעת את זה? כי כאשר אנחנו בונים מערכת, בדרך כלל אנחנו נרצה שלא רק אתר אחד יתחבר אליה.

  2. 00:14

    יכול להיות שיש לנו גם איזשהו סרוויס, כמו WCF או Web Service שמתחבר לדאטאבייס שלנו. יכול להיות שהאתר שלנו מאוד גדול, יכול להיות שיש גם אפליקציית ווינפורם או WPF שניגשת לדאטאבייס שלנו, ובכלל לא כדאי לקחת את כל מה שקשור לדאטאבייס ולשים אותו בתוך הפרויקט mvc.

  3. 00:37

    אז אנחנו הולכים עכשיו לראות איך לחלק את המערכת לחלקים. אז בעצם לכל המערכת כולה יש שלושה חלקים. חלק אחד זה הדאטאבייס עצמו, שם יושבות ה-Stored Procedures, הטבלאות, הכישורים בין הטבלאות, פונקציות ואולי עוד כל מיני דברים כמו Views שזה מבט על טבלה, או טריגרים שזה בעצם פעולות שניתן לבצע כאשר מבצעים insert, update או delete.

  4. 01:04

    זה חלק אחד וזאתי שכבה נפרדת של המערכת. הדבר הזה כבר יש לנו כאן. הדבר השני שיש לנו זה האתר mvc. פרויקט mvc מכיל את הקונטרולר, את הדפים עצמם, את ה-views וחלק מהמודל שאנחנו ראינו כאן של החלקים של ה-partial.

  5. 01:26

    אבל מה שהמודל לא צריך להכיל בתוך הפרויקט של ה-mvc שלנו ואת כל התקשורת עם הדאטאבייס, מה שראינו כאן, את כל שאילתות ה-SQL, את כל הפנייה לדאטאבייס ואת התצורה של כל המחלקות הללו.

  6. 01:42

    כל הדברים האלה צריכים לשבת בפרויקט נפרד, ועכשיו אנחנו הולכים לראות איך בדיוק להרים מערכת כזאת. אז הדבר הראשון שאנחנו הולכים לבצע זה להוסיף לסלושן פרויקט נוסף.

  7. 01:54

    יש לנו פה את הסלושן, כרגע אנחנו רואים שיש בו one project, שזה הפרויקט של אתר ה-MVC שלנו. אנחנו הולכים ללחוץ מקשימני על הסלושן, לבצע add new project ולבחור מתוך c-sharp ב-class library.

  8. 02:13

    זה בעצם פרויקט dll ואנחנו רואים שהפרויקט הזה מתווסף לתיקייה של הסלושן. בואו נקרא לו business logic. זה שם מאוד ידוע שמומלץ לתת למערכות שניגשות לדאטאבייס.

  9. 02:32

    בדרך כלל זה dll שפשוט מאוד מכיל את כל הפניות לדאטאבייס וצריך להיות בנוי בצורה מאוד מאוד ספציפית. אז יש לנו פה את הפרויקט הזה, בואו נוסיף אותו.

  10. 02:43

    וכעת יש לנו שני פרויקטים בתוך ה-Solution, יש לנו את ה-Business Logic, ויש לנו את הפרויקט של MVC שקראתי לו N-Tiers. דבר ראשון, יש לנו פה איזושהי מחלקה, אנחנו הולכים לשנות את השם שלה ל-Base Logic.

  11. 02:59

    זאת מחלקת בסיס שכל מחלקות הלוגיקה שפונות לדאטאבייס הולכות לרשת מה-Base Logic. כל המחלקות בתוך ה-DLL שאנחנו רוצים לגשת אליהן מחוץ הדי-אל-אל חייבות להיות מוגדרות כפאבליק ולכן גם המחלקה הזאת היא פאבליק.

  12. 03:15

    הדבר הבא שאנחנו צריכים לבצע זה להוסיף ל-Business Logic את ה-Entity Framework. אנחנו הולכים ל-Add New Item, בוחרים מתוך Data ADO.NET Entity Data Model ומגדירים לו את השם Northwind.

  13. 03:32

    זאת אומרת ש-Entity Framework לא הולכת להיות כמעט אף פעם כחלק מאתר ה-MVC אלא הולכת להיות ב-DLN נפרד וכך זה יהיה הרבה יותר מובנה והרבה יותר מודולרי.

  14. 03:45

    נבצע Add, נבחר Generate From Database, נתממשק לאותו מסד נתונים, נביא את כל הטבלאות ואת כל ה-Stored Procedures, Finish, וכעת אנחנו יכולים לראות שהתווסף לנו לתוך פרויקט ה-DLL כל המערכת של Entity Framework.

  15. 04:15

    אנחנו יכולים לראות שזה נמצא כאן. כעת כל מה שאנחנו צריכים לעשות זה לבנות את כל הפעילויות הדרושות לאפליקציה מתוך ה-Business Logic.

  16. 04:26

    דבר ראשון, בתוך ה-Base Logic, זאת מחלקת הבסיס שכל המחלקות בביזנס לוג'יק יורשות אותה. אנחנו צריכים להגדיר את אותו אובייקט של אנטיטי פריימורק שמסוגל לבצע את הפעולות על הדאטאבייס.

  17. 04:42

    אז נגדיר כאן משתנה פרייבט מסוג Northwind Entities נקרא לו underline db, ניצור אובייקט חדש ממנו וניצור משתנה מסוג Northwind Entities נקרא לו db באותיות גדולות אבל הדבר הזה הוא פרופרטי שיש לו גט בלבד, מחזיר לנו את ה-DB והוא מוגדר כ-protected בכדי שרק מחלקות יורשות את ה-base logic יוכלו לגשת אליו וכמובן גם ניתן לגשת

  18. 05:16

    מתוך ה-base logic ל-DB. הדבר הבא שאנחנו צריכים לעשות זה לרשת את ה-interface i-disposable לממש אותו ובפונקציה dispose לקרוא ל-dispose של אובייקט הדאטאבייס.

  19. 05:36

    כך מי שמשתמש ב-base logic יוכל בעצמו לקרוא ל-dispose ולשחרר משאבים. המשאבים יישארו פתוחים אפשר להיפטר מכל מרחבי השמות שיש פה ויש לנו כרגע את הבייס לוג'יק מוכן עכשיו אנחנו צריכים ללכת ולכתוב מחלקה נפרדת עבור כל אזור נפרד בדאטה בייס אם יש לנו בדאטה בייס את המחלקה או יותר נכון את הטבלה פרודקטס אנחנו כנראה רוצים לעשות

  20. 06:05

    הרבה פעולות על פרודקטס כל הפעולות שמתבצעות על פרודקטס צריכות להיות בתוך מחלקה נפרדת קלאס שנקרא כנראה פרודקטס לוג'יק והוא מכיל את כל הלוגיקה בנוגע למוצרים.

  21. 06:19

    אם יש לנו לדוגמה איזושהי טבלה שמתארת עובדים וטבלה שמתארת טלפונים של עובדים, אז אנחנו כנראה לא נצטרך שתי מחלקות, אנחנו נצטרך מחלקה אחת שמטפלת בעובדים וגם בטלפונים שלהם, כי זה די קשור אחד לשני.

  22. 06:34

    אבל בוודאות תהיה לנו מחלקה נפרדת עבור עובדים ומחלקה נפרדת עבור מוצרים. אז מה שאנחנו צריכים לעשות זה לחזור ל-Business Logic, לצרף עוד קלאס, נקרא לה Products Logic, נגדיר את הקלאס הזאת כפאבליק בכדי שניתן יהיה

  23. 06:55

    לגשת אליה מחוץ ל-DLL וכמובן היא הולכת לרשת את ה-BasedLogic. כאן בתוך המחלקה הזאת אנחנו הולכים לבנות את כל הפעילויות שאנחנו רוצים לבצע עבור כל המוצרים.

  24. 07:11

    נתחיל עם בחירת כל המוצרים. אז יש לנו כאן פונקציה והיא מחזירה לנו ליסט של פרודקט, נקרא לה getProducts, היא לא תקבל כלום והיא הולכת להחזיר לנו את כל המוצרים.

  25. 07:29

    אז כל מה שאנחנו צריכים לעשות זה להחזיר את db, שימו לב שיש לנו פה את db כי הוא פרוטקטד וניתן לגשת אליו עם החלקות ירשות נקודה products.tool list סיימנו לבנות את הפונקציה הראשונה יש לנו עוד ארבע פונקציות יש לנו פונקציה שמחזירה product אחד get product היא מקבלת product id ומחזירה לנו מוצר אחד ויחיד אז כל מה שאנחנו צריכים לעשות זה return db.first or default או

  26. 08:05

    יותר נכון Products, פרודקטסטור דיפולט, ניתן איזשהו מוצר ונאתר רק את המוצר שהפרודקט איי-די שלו שווה לפרודקט איי-די שהתקבל לפונקציה.

  27. 08:19

    איזשהו כלל אצבע מאוד חשוב, השמות של המשתנים הם מאוד מאוד חשובים. מה שקורה זה שבמסד הנתונים קודם כל הוגדרה עמודה שנקראת Product ID. בגלל שהיא הוגדרה כפרודקט ID בשם הזה, אז אוטומטית אנטיטי פריימורק יוצרת את המאפיין product ID שזהה לשם של העמודה.

  28. 08:45

    לכן אנחנו צריכים לשמור על השם הזה ואם יש לי משתנה שנקרא product ID שאני מקבל אותו לפונקציה אז אני חייב לשמור על אותה מוסכמה. זה בעצם שומר שאני לא אעשה טעויות בהמשך וגם מי שמשתמש בפונקציה יודע שהוא צריך להעביר product ID ולא סתם ID כללי כלשהו.

  29. 09:02

    הפונקציה הבאה בתור שאנחנו הולכים לכתוב מחזירה void ונקראת add product. ממש כל הפעילויות שאנחנו רוצים לבצע באתר שלנו, כל פעילות כזאת הולכת להתכתב על ידי פונקציה שיושבת בביזנס לוג'יק.

  30. 09:18

    Add product הולכת לקבל את הפרמטרים של מוצר אחד ויחיד, או הולכת לקבל גם product, היא יכולה ממש לקבל product אמיתי,

לקורס המלא: קורס MVC אונליין בעברית

ההרצאה הקודמת: שימוש ב-Stored Procedures

ההרצאה הבאה: שימוש בתבניות מוכנות - Scaffold

הרצאות קשורות מקורסים אחרים

  • שימוש ב-useEffect - חלק 1
  • שימוש ב-ModelState
  • בדיקות מקרי שימוש
  • שימוש בנתונים מ-CSV

קורסים נוספים במסלול

  • קורס Entity Framework Core - עבודה עם מסד נתונים בדוט-נט
  • קורס דוט-נט - NET Core. - עם Rest API
  • קורס ASP.NET
  • קורס Git ו-GitHub עם Visual Studio