سلام
دوستان تفاوت بین استفاده از new کردن یک کلاس یا تزریق کردن اون کلاس به برنامه چی هست؟ممنون
سلام
دوستان تفاوت بین استفاده از new کردن یک کلاس یا تزریق کردن اون کلاس به برنامه چی هست؟ممنون
در صورت new کردن یک کلاس ، شما به اون کلاس وابسته شدید.
اگر از interface ها با تزریق وابستگی کار کنید ، خیلی راحت میتونید هر زمان خواستید پیاده سازی متفاوتی از اون رو داخل برنامتون ایجاد کرده و داخل IoC Container تون جایگزینش کنید.
با یک مثال جلو میریم :
تصور کنید امروز از SQL Server و EF داخل برناممون استفاده میکنیم و چندجا ApplicationDbContext رو new کردیم.
چند وقت بعد به هر دلیلی به این نتیجه میرسیم که SQL Server جوابگوی نیاز ما نیست و از MongoDB میخوایم استفاده کنیم;
ما در جاهای متعددی ApplicationDbContext رو new کردیم و به اون وابسته شدیم ، و حالا اگر بخوایم اون رو با چیز دیگه ای جابه جا کنیم ، مجبور هستیم بسیاری از کدهامون رو تغییر بدیم.
اما اگر از تزریق وابستگی استفاده میکردیم چطور ؟
در این صورت یک interface با متدهایی که همیشه استفاده میکنیم و در همه دیتابیس موجود بودند مینوشتیم.
کلاس هایی که میساختیم که این interface رو پیاده سازی کنن ; کلاسی برای ارتباط با SQL Server ، کلاس دیگری برای ارتباط با Mongo ، کلاسی دیگری برای ارتباط با ...
در اینجا برنامه ما وابسته به یک دیتابیس نبود ، فقط کافی بود interface مورد نیاز رو برای هردیتابیسی که لازم داشتیم پیاده سازی کنیم و به راحتی ، با IoC Container با عوض کردن فقط 1 خط دیتابیس برناممون رو بدون تغییر جای دیگه ای از کد عوض کنیم.
این سناریو برای خیلی استفاده های دیگه مثل Email Service از Provider های مختلف ، SMS Provider های مختلف و ... صدق میکنه.
خوندن این مقاله رو هم به شما پیشنهاد میکنم : https://ardalis.com/new-is-glue
ممنون . در کل چه فرقی بین این دوتا کد هست ؟
public class UnitOfWork : IDisposable
{
private DataContext context = new DataContext();
private GenericRepository<Department> departmentRepository;
public GenericRepository<Department> DepartmentRepository
{
get
{
if (this.departmentRepository == null)
{
this.departmentRepository = new GenericRepository<Department>(context);
}
return departmentRepository;
}
}
با این کد
public class UnitOfWork : IDisposable
{
private readonly DataContext context;
private readonly departmentRepository _dep;
public UnitOfWork(DataContext dbContext, departmentRepository dep)
{
context = dbContext;
_dep = dep;
}
public departmentRepository departmentRepository
{
get
{
return _dep;
}
}
تزریق وابستگی مثل بالا رفتن از یک ساختمان با آسانسوره و استفاده از new مثل اینه که همه ی طبقه ها رو از پله بالا برید.
وقتی از new استفاده می کنید باید لایه به لایه خودتون وابستگی های یک کلاس رو پیدا و نمونه سازی (instantiation) کنید. در عوض وقتی از تزریق وابستگی با بهتره بگیم IoC استفاده می کنید فقط وارد آسانسور میشید و میگید که به کدام طبقه می خواهید برسید و عمل بالا رفتن توسط آسانسور انجام میشه و نه شما.
تزریق وابستگی بخشی از مکانیزم کنترل معکوس یا Inversion Of Control هست. که به IoC معروفه. در این مکانیزم شما اختیارات بعضی از کارها را از دست خودتون خارج می کنید و به شخص دیگری میسپارید. شما فقط با هدف کار دارید و راه رسیدن به اون به عهده ی شخص دیگری است (آسانسور)
در کارهای روزمره خیلی موارد هست که ما از کنترل معکوس استفاده می کنیم. مثلا ما نمیریم نون درست کنیم بلکه میریم نون آماده رو می خریم. در اینجا ما کنترل پخت نان رو سپردیم به کس دیگری و رفتیم از دسترنجش استفاده کردیم.
وقتی شما پروژه ی چند لایه ندارید استفاده ی مستقیم از new مشکلی نداره. ولی وقتی یک شی به شی دیگری وابسته است و شی درونی هم به شی درونی تری و ... برای اینکه یک نمونه از شی ایجاد کنید باید همه ی وابستگی های اون شی رو پیدا کنید و نمونه سازی کنید. در حالی که در سیستم IoC شما فقط شی هدف رو مشخص می کنید و نمونه سازی ها به عهده ی IoC Container هست.
در ASP.NET MVC 5 و ماقبل معمولا از Structure Map و Ninject و امثال اون استفاده میشد. در ASP.NET Core یک IoC Container درون فریم ورک ساخته شده و عملا لازم به فریم ورک جانبی ندارید. (هر چند که میشود هر سیستم تریق وابستگی مانند Ninject رو بجای پیشفرض ASP.NET Core قرار داد)
IOC خود Core نیازمندیهای تزریق وابستگی سیستم رو بر طرف میکنه و نیازی یه شرکتهای ثالث نیست ولی امکاناتی که شرکت های ثالث در اختیار میدهند بیشتر هست
مثل خاصیت scan کردن اسمبلی های برنامه شما ودیگر اینکه تنظیمات اولیه IOC های دیگر نسبت به خود Core کمتر هست و همچنین از نظر performance تفاوت هایی دارند