View Full Version : new کردن از یک شی یا تزریق آن شی ؟
sara_t
شنبه 16 تیر 1397, 17:22 عصر
سلام
دوستان تفاوت بین استفاده از new کردن یک کلاس یا تزریق کردن اون کلاس به برنامه چی هست؟ممنون
Moien Tajik
شنبه 16 تیر 1397, 17:40 عصر
در صورت 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
sara_t
یک شنبه 17 تیر 1397, 00:51 صبح
ممنون . در کل چه فرقی بین این دوتا کد هست ؟
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;
}
}
Moien Tajik
یک شنبه 17 تیر 1397, 09:30 صبح
ممنون . در کل چه فرقی بین این دوتا کد هست ؟
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;
}
}
فرق این ها این هست که در اولی بطور مستقیم از DataContext وهله سازی شده ، اما در دومی داخل IoC Container ما تنظیم شده که هر زمان در Constructor هر کلاسی ، DataContext درخواست شد ، نمونه ای که در IoC Container ثبت شده دریافت شود.
قطعا روش دوم بهتر هست.
hakim22
یک شنبه 17 تیر 1397, 11:29 صبح
تزریق وابستگی مثل بالا رفتن از یک ساختمان با آسانسوره و استفاده از 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 قرار داد)
r4hgozar
یک شنبه 17 تیر 1397, 19:35 عصر
تزریق وابستگی مثل بالا رفتن از یک ساختمان با آسانسوره و استفاده از 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 قرار داد)
ممنون از توضیحاتتون.
اما ایا ninject در mvc core سرعت رو پایین نمیاره و آیا استفاده از اون منطقیه؟
منظروم اینکه که آیا ninject سحولت انجام کار رو زیاد می کنه یا IOC خود core جامع هست؟
ali_md110
یک شنبه 17 تیر 1397, 22:06 عصر
IOC خود Core نیازمندیهای تزریق وابستگی سیستم رو بر طرف میکنه و نیازی یه شرکتهای ثالث نیست ولی امکاناتی که شرکت های ثالث در اختیار میدهند بیشتر هست
مثل خاصیت scan کردن اسمبلی های برنامه شما ودیگر اینکه تنظیمات اولیه IOC های دیگر نسبت به خود Core کمتر هست و همچنین از نظر performance تفاوت هایی دارند
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.