כיצד ליישם את דפוס העיצוב של מאגר ב- C #

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

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

בשימוש בתבנית העיצוב של מאגר, אתה יכול להסתיר את הפרטים כיצד הנתונים מאוחסנים או מאוחסנים בסופו של דבר אל מאגר הנתונים וממנו. מאגר נתונים זה יכול להיות בסיס נתונים, קובץ XML וכו '. ניתן להחיל דפוס עיצוב זה כדי אפילו להסתיר את הגישה לנתונים שנחשפים על ידי שירות אינטרנט או ORM. מרטין פאולר קובע: "מתווך בין שכבות הדומיין למיפוי נתונים באמצעות ממשק דמוי אוסף לגישה לאובייקטים של דומיינים."

מאגר מוגדר כאוסף של אובייקטים מתחום השוכנים בזיכרון. ה- MSDN קובע: "השתמש במאגר כדי להפריד בין הלוגיקה השואבת את הנתונים וממפה אותם למודל הישות לבין ההיגיון העסקי הפועל על פי המודל. ההיגיון העסקי צריך להיות אגנוסטי לסוג הנתונים המורכב משכבת ​​מקור הנתונים. . לדוגמא, שכבת מקור הנתונים יכולה להיות מסד נתונים, רשימת SharePoint או שירות אינטרנט. "

יישום דפוס העיצוב של המאגר ב- C #

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

  1. ממשק IRepository - ממשק זה הוא סוג הבסיס לכל סוגי המאגר
  2. מחלקת מאגר - זהו המחלקה הגנרית הכללית
  3. מחלקה מאגר אחד או יותר המיישמים את ממשק IRepository

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

public abstract class EntityBase

   {

       public Int64 Id { get; protected set; }

   }

הכיתה מוגדרת כמופשטת עם שדה אחד בלבד - בשם "Id". שדה "מזהה" משותף לכל הישויות שאתה משתמש בהן בדרך כלל, לא? כך ייראה ממשק IRepository הגנרי.

public interface IRepository where T : EntityBase

   {

       T GetById(Int64 id);

       void Create(T entity);

       void Delete(T entity);

       void Update(T entity);

   }

המחלקה הכללית Repository מיישמת את ממשק IRepository ומיישמת את חברי הממשק.

public class Repository : IRepository where T : EntityBase

   {

       public void Create(T entity)

       {

           //Write your logic here to persist the entity

       }

       public void Delete(T entity)

       {

           //Write your logic here to delete an entity

       }

       public T GetById(long id)

       {

           //Write your logic here to retrieve an entity by Id

           throw new NotImplementedException();

       }

       public void Update(T entity)

       {

           //Write your logic here to update an entity

       }

   }

יצירת מאגרים לשיעורים ספציפיים

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

public class CustomerRepository : IRepository

   {

       //Write your code here to implement each of the methods of the IRepository interface.

   }

באופן דומה, אם היית יוצר מאגר ProductRepository, עליך ליצור תחילה מוצר של מחלקת ישויות המרחיב את מחלקת EntityBase.

public class Product: EntityBase

   {

       public string ProductName { get; set; }

       public string Category { get; set; }

   }

מחלקת ProductRepository צריכה ליישם את ממשק IRepository הגנרי. כך נראה מחלקת ProductRepository.

public class ProductRepository : IRepository

   {

       //Write your code here to implement each of the methods of the IRepository interface.

   }