نمایش نتایج 1 تا 7 از 7

نام تاپیک: new کردن از یک شی یا تزریق آن شی ؟

  1. #1

    new کردن از یک شی یا تزریق آن شی ؟

    سلام
    دوستان تفاوت بین استفاده از new کردن یک کلاس یا تزریق کردن اون کلاس به برنامه چی هست؟ممنون

  2. #2

    نقل قول: 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

  3. #3

    نقل قول: new کردن از یک شی یا تزریق آن شی ؟

    ممنون . در کل چه فرقی بین این دوتا کد هست ؟


    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;
    }
    }



  4. #4

    نقل قول: new کردن از یک شی یا تزریق آن شی ؟

    نقل قول نوشته شده توسط sara_t مشاهده تاپیک
    ممنون . در کل چه فرقی بین این دوتا کد هست ؟


    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 ثبت شده دریافت شود.
    قطعا روش دوم بهتر هست.

  5. #5

    نقل قول: new کردن از یک شی یا تزریق آن شی ؟

    تزریق وابستگی مثل بالا رفتن از یک ساختمان با آسانسوره و استفاده از 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 قرار داد)

  6. #6
    کاربر دائمی
    تاریخ عضویت
    مهر 1390
    محل زندگی
    rayancode.ir
    پست
    1,559

    نقل قول: new کردن از یک شی یا تزریق آن شی ؟

    نقل قول نوشته شده توسط hakim22 مشاهده تاپیک
    تزریق وابستگی مثل بالا رفتن از یک ساختمان با آسانسوره و استفاده از 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 جامع هست؟

  7. #7
    کاربر دائمی آواتار ali_md110
    تاریخ عضویت
    فروردین 1385
    محل زندگی
    شیراز
    پست
    1,181

    نقل قول: new کردن از یک شی یا تزریق آن شی ؟

    IOC خود Core نیازمندیهای تزریق وابستگی سیستم رو بر طرف میکنه و نیازی یه شرکتهای ثالث نیست ولی امکاناتی که شرکت های ثالث در اختیار میدهند بیشتر هست
    مثل خاصیت scan کردن اسمبلی های برنامه شما ودیگر اینکه تنظیمات اولیه IOC های دیگر نسبت به خود Core کمتر هست و همچنین از نظر performance تفاوت هایی دارند

تاپیک های مشابه

  1. سوال: پیدا کردن هندل یک شی که caption آن را نمیدانیم از روی class name
    نوشته شده توسط crafcrab در بخش برنامه نویسی در 6 VB
    پاسخ: 2
    آخرین پست: پنج شنبه 13 بهمن 1390, 17:05 عصر
  2. سوال: کلیک کردن روی یک تصویر و حذف آن از دیتابیس
    نوشته شده توسط charkhkar در بخش C#‎‎
    پاسخ: 0
    آخرین پست: شنبه 12 آذر 1390, 19:01 عصر
  3. پاسخ: 1
    آخرین پست: سه شنبه 08 آذر 1390, 23:23 عصر
  4. سوال: استفاده از اطلاعات 3 جدول در یک DetailView یا شبیه آن
    نوشته شده توسط zakieh در بخش ASP.NET Web Forms
    پاسخ: 0
    آخرین پست: یک شنبه 24 مرداد 1389, 15:28 عصر
  5. پاسخ: 3
    آخرین پست: سه شنبه 25 اسفند 1388, 10:47 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •