ما هي 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.
اترك تعليقك