حقن التبعية للنوع الفردي Dependency Injection for Single Type
-
في هذا الدرس بناقش كيفية استخدام Dependency Injection إذا كان عندنا في التطبيق simple class غير مربوطة (لا تنفذ) ب Interface ، هنا وفي مثل هاذه الحالة يمكن استخدتم النوع الفردي Single Type. في مثل هذه الحالة يمكنك استخدام تقنية Dependency Injection.
تمام اول اشي بنحتاجو هو أنشاء class جديد باسم CourseSum.cs إلى مجلد Repository وبعدها نضيف الكود المدرج أدناه:
using StudentsAcademy.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace StudentsAcademy.Repository
{
public class CourseSum
{
public ICourses ICourses { get; set; }
public CourseSum(ICourses repo)
{
ICourses = repo;
}
public decimal Total => ICourses._CoursesModel.Sum(p => p.Price);
}
}
في هذا class لا يتم تنفذ أي interface. ببساطة عملنا function تسمى الإجمالي sum الذي يقوم بإرجاع مجموع كل المواد الموجودة في CourseRepository .
يعتمد هذا ال class على ICourses interface وسيتم حلها بواسطة service provider configuration الذي قمنا بتطبيقه بالفعل على ()ConfigureServices .
الآن ننتقل الى CoursesController في التطبيق،وسنقوم بانشاء dependency ل class CourseSum وذلك بتعيين متغير من نوع ViewBag في Constructor بحيث يحتوي على مجموع كل المواد. سيتم عرض متغيرات ViewBag هذه في View.
عدل الكود الخاص ب CoursesController الى :
using Microsoft.AspNetCore.Mvc;
using StudentsAcademy.Interface;
using StudentsAcademy.Repository;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace StudentsAcademy.Controllers
{
public class CoursesController : Controller
{
private ICourses _CoursesRepository;
private CourseSum _CourseSum;
public CoursesController(ICourses repo, CourseSum Csum)
{
_CoursesRepository = repo;
_CourseSum = Csum;
}
public IActionResult Index()
{
ViewBag.Total = _CourseSum.Total;
return View(_CoursesRepository._CoursesModel);
}
}
}
الخطوة الأخيرة هي عمل الاعدادت الخاصة بذلك، يعني المطلوب عمل configure ل service provider لإخباره بكيفية تشغيل هذه التبعية. لذا أضف سطر الكود التالي ()ConfigureServices
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.AddTransient<CourseSum>();
services.AddSingleton<TotalStudents>();
services.AddControllersWithViews();
}
لاحظ أنه لا يوجد mapping بين نوع الخدمة ونوع التنفيذ في هذه الحالة. حيث استخدمنا ()AddTransient مع parameter واحد فقط. بهذه الطريقة، أخبرنا service provider ببدء CourseSum class لحل dependency على هذا النوع.
وبهيك بنكون طبقنا Dependency Injection for Single Type.
قم بتشغيل التطبيق الخاص بك وسترى السعر الإجمالي لجميع المنتجات المعروضة في المتصفح:

اترك تعليقك