ما هي Dependency Chains

-

معنى Dependency Chains تعني ان التبعية نفسها تعتمد على مكون آخر. على سبيل المثال ، إذا كان المكون "A" يعتمد على مكون آخر يسمى "B" ، بينما يعتمد B على مكون يسمى "C". بهذه الطريقة تصبح هذه سلسلة تبعية. تعد ميزة حقن التبعية في ASP.NET Core ذكية جدًا لحل Dependency Chain.

تمام نبدأ بمثال عملي:
أضف ملف من نوع interface  باسم IStorage.cs إلى مجلد interface  ثم اضف الكود أدناه:

using StudentsAcademy.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace StudentsAcademy.Interface
{
   public interface IStorage
    {
        IEnumerable<CoursesModel> Courses { get; }
        CoursesModel this[string key] { get; set; }
        bool ContainsKey(string key);
        void RemoveItem(string key);
    }
}
الان بنعمل إضافة class جديد باسم StorageRepository.cs داخل مجلد Repository ومن ثم أضف الكود التالي (الغرض من هذا ال class هو تنفيذ interface) 

using StudentsAcademy.Interface;
using StudentsAcademy.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace StudentsAcademy.Repository
{
    public class StorageRepository : IStorage
    {
        private Dictionary<string, CoursesModel> courses = new Dictionary<string, CoursesModel>();
        public CoursesModel this[string key]
        {
            get { return courses[key]; }
            set { courses[key] = value; }
        }
        public IEnumerable<CoursesModel> Courses => courses.Values;
        public bool ContainsKey(string key) => courses.ContainsKey(key);
        public void Remove(string key) => courses.Remove(key);
    }
}
تحدد StorageRepository class سلوك آلية تخزين بسيطة لكائنات courses.
انتقل الآن إلى CourseRepository.cs class التي تم إنشاؤها مسبقًا وأنشئ dependency على IStorage interface. للقيام بذلك ، أضف argument من نوع IStorage في constructor ل class Repository.cs.4

كود IStorage interface

using StudentsAcademy.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace StudentsAcademy.Interface
{
   public interface IStorage
    {
        IEnumerable<CoursesModel> Courses { get; }
        CoursesModel this[string key] { get; set; }
        bool ContainsKey(string key);
        void Remove(string key);
    }
}

ثم قم بتعديل الكود في CourseRepository كما هو في الاسفل

using StudentsAcademy.Interface;
using StudentsAcademy.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace StudentsAcademy.Repository
{
    public class CourseRepository : ICourses
    {
        private IStorage storage;
        public CourseRepository(IStorage repo)
        {
            storage = repo;
            new List<CoursesModel> {
                 new CoursesModel { CourseNumber = "0001",CourseName="Math",CourseDescription="Math Desc",Capacity=20, Price = 115 },
               new CoursesModel { CourseNumber = "0002",CourseName="Sciences",CourseDescription="Sciences Desc",Capacity=30, Price = 120 },
               new CoursesModel { CourseNumber = "0003",CourseName="Physics",CourseDescription="Physics Desc",Capacity=25, Price = 140 }
            }.ForEach(p => AddCourse(p));
        }
        public IEnumerable<CoursesModel> _CoursesModel => storage.Courses;
        public CoursesModel this[string name] => storage[name];
        public void AddCourse(CoursesModel Courses) => storage[Courses.CourseName] = Courses;
        public void DeleteCourse(CoursesModel Courses) => storage.Remove(Courses.CourseNumber);
    }
}

وبهذه التغييرات، تم إنشاء سلسلة تبعية Dependency Chain على النحو التالي:
• 1. تعتمد CoursesController Class على كائن ICourses.
• 2. يعتمد كائن ICourses بدوره على كائن IStorage.
الان يجب اخبار Service provider  بكيفية التعامل مع Dependency Chain عن طريق إضافة الكود التالي في Startup.cs class

services.AddTransient<IStorage, StorageRepository>(); 
داخل ConfigureServices() method كما هو موضح أدناه:

public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<Connections>(Configuration.GetSection("ConnectionStrings"));
            services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
            services.AddTransient<ICourses, CourseRepository>();
            services.AddTransient<IStorage, StorageRepository>();
            services.AddSingleton<TotalStudents>();
            services.AddControllersWithViews();
        } 
أعد تشغيل التطبيق باستخدام نفس الرابط السابق
https://localhost:44382/courses
 وسترى جميع منتجاتك المواد في المتصفح تمامًا كما كان من قبل.
الاختلاف الوحيد هو: هنا تم تطبيق  Dependency Chains.