این مقاله درک اساسی از معماری جداشده و انواع مختلف الگوهای تزریق وابستگی مانند:
- تزریق ستر
- تزریق سازنده
- تزریق تابع
در این مقاله همه آنها را با یک مثال با استفاده از Unity Framework پیاده سازی می کنیم. حال بیایید بحث کنیم که یونیتی چیست و چه مزایایی دارد.
Unity یک کانتینر IoC است که توسط مایکروسافت منتشر شده است و بسیار ساده، انعطاف پذیر و آسان برای استفاده است. اگرچه کانتینرهای IoC زیادی در بازار موجود است که بسیار قوی تر از Unity هستند، اما برای سادگی و درک مفاهیم اولیه، یکی از بهترین انتخاب ها است.
بنابراین، چارچوب Unity یک ظرف وابستگی سبک و قابل توسعه است. ساخت برنامه های کاربردی با اتصال آزاد را تسهیل می کند و مزایای زیر را در اختیار توسعه دهندگان قرار می دهد.
- ایجاد شی ساده شده، به ویژه برای ساختارها و وابستگی های شی سلسله مراتبی
- انتزاع الزامات؛ این به توسعه دهندگان اجازه می دهد تا وابستگی ها را در زمان اجرا یا در پیکربندی مشخص کرده و ساده کنند
و یکی دیگر از مزیت های کانتینر IoC این است که وقتی آن را پیاده سازی می کنیم، می توانیم آن را به هر برنامه ای وصل کنیم تا قابل اتصال باشد و نیازی به پیکربندی دوباره و دوباره نداشته باشد.
در این مثال ما در حال پیاده سازی یک مثال در یک برنامه کنسول هستیم، بنابراین من از شما انتظار دارم که یک برنامه کنسول ایجاد کنید و بسته زیر را از NuGet Package Manager اضافه کنید.
هنگامی که بسته با موفقیت در برنامه نصب شد، منابع زیر را خواهید یافت.
اپلیکیشن ما اکنون برای استفاده از Unity آماده است و Dependency Injection را با استفاده از آن پیاده سازی می کنیم. همانطور که گفتیم سه نوع الگوی DI وجود دارد که همه آنها را یکی یکی پیاده سازی می کنیم.
تزریق وابستگی توسط Property injection
در اینجا ما وابستگی ها را با استفاده از ویژگی ها تزریق می کنیم. بیایید پیاده سازی زیر را درک کنیم. ما یک کلاس Employee و یک کلاس Company داریم و کلاس Employee به کلاس Company وابسته است. هنگامی که ما سعی می کنیم حقوق یک کارمند را با فراخوانی تابع DisplaySalary() چاپ کنیم، در داخل تابع ShowSalary() کلاس Company را فراخوانی می کند.
از آنجایی که این تزریق ویژگی است، باید از ویژگی [وابستگی] روی ویژگی استفاده کنیم.
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Net.Http;
- using System.Net;
- using System.Net.Http.Headers;
- using Microsoft.Practices.Unity;
- namespace Client
- {
- public interface IEmployee
- {
- }
- public class Employee : IEmployee
- {
- private ICompany _Company;
- [Dependency]
- public ICompany Company
- {
- get { return _Company; }
- set { _Company = value; }
- }
- public void DisplaySalary()
- {
- _Company.ShowSalary();
- }
- }
- public interface ICompany
- {
- void ShowSalary();
- }
- public class Company : ICompany
- {
- public void ShowSalary()
- {
- Console.WriteLine("Your salary is 40 K");
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- IUnityContainer unitycontainer = new UnityContainer();
- unitycontainer.RegisterType<ICompany, Company>();
- Employee emp = unitycontainer.Resolve<Employee>();
- emp.DisplaySalary();
- Console.ReadLine();
- }
- }
- }
حالا بیایید سعی کنیم تابع Main() را درک کنیم، اول از همه یک شی از IUnityContainer با خط زیر ایجاد می کنیم:
- IUnityContainer unitycontainer = new UnityContainer();
سپس کلاسی را که کلاس اصلی به آن وابسته است ثبت می کنیم. در مثال ما گفتیم که کلاس Employee به کلاس Company وابسته است. بنابراین باید کلاس Company را به کانتینر اضافه کنیم.
- unitycontainer.RegisterType<ICompany, Company>();
خوب، اکنون ظرف برای حل وابستگی یک کلاس دیگر آماده است. اکنون یک شی از کلاس Employee ایجاد می کنیم و وابستگی آن را با استفاده از ظرف IoC مانند شکل زیر حل می کنیم:
- Employee emp = unitycontainer.Resolve<Employee>();