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

نام تاپیک: مشکل جدی با Dependency Injection

  1. #1

    مشکل جدی با Dependency Injection

    سلام دوستان

    حقیقتش من اکثر آموزش های آقای نصیری رو در مورد تزیق وابستگی خوندم و بخش مربوط به تزریق وابستگی در کتاب آقای راد رو هم خودندم اما متاسفانه متوجه نمی شم . می خواستم اگر یکی لطفا کنه همراه با مثال این موضوع رو برای من توضیح بده خیلی خیلی ممنونش می شم ...

    تشکر

  2. #2
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750

    نقل قول: مشکل جدی با Dependency Injection

    سلام

    1-یک کلاس درست کن که درونش یک تابع است که دو تا عدد رو میگیره با هم جمع میکنه و نتیجه رو برمیگردونه.
    2- حالا از این کلاست درون برنامه ات استفاده کن و دو تا عدد رو بهش پاس بده و نتیجه رو نمایش بده.

    این کار رو که کردی بگو تا ادامه داستان رو برات توضیح بدم.(برنامه رو پیوست باید کنی تا مطمئن بشم انجام دادی)

  3. #3

    نقل قول: مشکل جدی با Dependency Injection

    نقل قول نوشته شده توسط jaykob مشاهده تاپیک
    سلام دوستان

    حقیقتش من اکثر آموزش های آقای نصیری رو در مورد تزیق وابستگی خوندم و بخش مربوط به تزریق وابستگی در کتاب آقای راد رو هم خودندم اما متاسفانه متوجه نمی شم . می خواستم اگر یکی لطفا کنه همراه با مثال این موضوع رو برای من توضیح بده خیلی خیلی ممنونش می شم ...

    تشکر
    سلام دوست عزیز
    تزریق وابستگی به معنی از بین بردن وابستگی کلاس ها به هم دیگه با استفاده از واسط هاست. بدین معنی که به جای ساختن نمونه ای از یک کلاس در کلاس دیگر میتوانید از واسطی که آن کلاس را پیاده سازی کرده استفاده کنید.
    برای مثلا اگر یک کلاسی به اسم Product به همراه یک سری متدها وجود داشته باشد و قصد داشته باشید از این کلاس در کلاس مثلا خShoping استفاده کنید به جای ایجاد نمونه ای از Product در کلاس Shopping یک واسط تعریف میکنید که کلاس Product آن را پیاده سازی کرده باشید. آنگاه در سازنده کلاس Shopping از آن استفاده مینید . توسط کتابخانه هایی مثل Structure Map , Unity , Ninject هم میتونید به عنوان DIC استفاده کنید. اگر متوجه نشدید بگید با مثال توضیح بدم

  4. #4

    نقل قول: مشکل جدی با Dependency Injection

    نقل قول نوشته شده توسط hp1361 مشاهده تاپیک
    سلام

    1-یک کلاس درست کن که درونش یک تابع است که دو تا عدد رو میگیره با هم جمع میکنه و نتیجه رو برمیگردونه.
    2- حالا از این کلاست درون برنامه ات استفاده کن و دو تا عدد رو بهش پاس بده و نتیجه رو نمایش بده.

    این کار رو که کردی بگو تا ادامه داستان رو برات توضیح بدم.(برنامه رو پیوست باید کنی تا مطمئن بشم انجام دادی)
    سلام

    خیلی لطف می کنید ; طبق گفته شما من یک کلاس به اسم Plus ساختم با کد زیر :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;


    namespace Dependency_Injection.Models
    {
    public class Plus
    {


    public int CalculationPlus(int Number1, int Number2)
    {
    int sum = Number1 + Number2;
    return (sum);
    }


    }
    }

    و یک کنترلر به نام Home که در اکشن Index این کلاس رو صدا زدم و مقدار دادم و با ViewBag به View فرستادم :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using Dependency_Injection.Models;


    namespace Dependency_Injection.Controllers
    {
    public class HomeController : Controller
    {




    public ActionResult Index()
    {
    Plus plus = new Plus();
    ViewBag.Result= plus.CalculationPlus(56, 12);
    return View();
    }


    }
    }



    برنامه مشکلی نداره و جواب می شده . پروژه رو هم آپلود کردم :)

    http://uploadboy.com/af1bke91yd6m.html

    تشکر

  5. #5

    نقل قول: مشکل جدی با Dependency Injection

    نقل قول نوشته شده توسط mydonya مشاهده تاپیک
    سلام دوست عزیز
    تزریق وابستگی به معنی از بین بردن وابستگی کلاس ها به هم دیگه با استفاده از واسط هاست. بدین معنی که به جای ساختن نمونه ای از یک کلاس در کلاس دیگر میتوانید از واسطی که آن کلاس را پیاده سازی کرده استفاده کنید.
    برای مثلا اگر یک کلاسی به اسم Product به همراه یک سری متدها وجود داشته باشد و قصد داشته باشید از این کلاس در کلاس مثلا خShoping استفاده کنید به جای ایجاد نمونه ای از Product در کلاس Shopping یک واسط تعریف میکنید که کلاس Product آن را پیاده سازی کرده باشید. آنگاه در سازنده کلاس Shopping از آن استفاده مینید . توسط کتابخانه هایی مثل Structure Map , Unity , Ninject هم میتونید به عنوان DIC استفاده کنید. اگر متوجه نشدید بگید با مثال توضیح بدم
    سلام

    حقیقت امر اینه این توضیحات رو چندین بار خوندم اما نتونستم چیزی پیاده کنم به همین دلیل نیاز به مثال در شرایط واقعی و توضیحات ساده و قابل درک دارم ...

  6. #6

    نقل قول: مشکل جدی با Dependency Injection

    نقل قول نوشته شده توسط hp1361 مشاهده تاپیک
    سلام

    1-یک کلاس درست کن که درونش یک تابع است که دو تا عدد رو میگیره با هم جمع میکنه و نتیجه رو برمیگردونه.
    2- حالا از این کلاست درون برنامه ات استفاده کن و دو تا عدد رو بهش پاس بده و نتیجه رو نمایش بده.

    این کار رو که کردی بگو تا ادامه داستان رو برات توضیح بدم.(برنامه رو پیوست باید کنی تا مطمئن بشم انجام دادی)
    سلام مجدد

    البته به این صورت هم می شه نوشت کد کلاس :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;


    namespace Dependency_Injection.Models
    {
    public class CalPlus
    {
    public int Number1 { get; set; }
    public int Number2 { get; set; }
    private int _Sum { get; set; }


    public int Pluss()
    {
    _Sum = Number1 + Number2;
    return _Sum;
    }
    }
    }
    و نحوه صدا زدن و مقدا دادن در کنترلر و پاس دادن به view ...

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using Dependency_Injection.Models;


    namespace Dependency_Injection.Controllers
    {
    public class HomeController : Controller
    {




    public ActionResult Index()
    {


    CalPlus plus2 = new CalPlus();
    plus2.Number1 = 12;
    plus2.Number2 = 122;
    ViewBag.Result2 = plus2.Pluss();


    return View();




    }


    }
    }


    تشکر

  7. #7
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750

    نقل قول: مشکل جدی با Dependency Injection

    سلام

    1- فرقی نمیکنه که از کدوم یکی از دو پیاده سازی استفاده کنی(برای این مثال ما)
    2- حالا یه کلاس بنویس بنام Multiple که دو عدد رو بگیره و با هم ضرب کنه و نتیجه رو برگردونه. اینبار از این پیاده سازی در کنترلر استفاده کن و نتیجه ضرب رو نمایش بده

    کد رو بنویس و اینجا بزار تا بریم ادامه داستان.(فقط کد رو بزاری کافیه. لازم نیست توی یک سایت دیگه هم اپلود کنی)
    آفرین که گوش کردی و کدت رو نوشتی و اینجا گذاشتی.معلومه میخوای واقعا یاد بگیری
    آخرین ویرایش به وسیله hp1361 : شنبه 03 خرداد 1393 در 20:37 عصر

  8. #8

    نقل قول: مشکل جدی با Dependency Injection

    نقل قول نوشته شده توسط hp1361 مشاهده تاپیک
    سلام

    1- فرقی نمیکنه که از کدوم یکی از دو پیاده سازی استفاده کنی(برای این مثال ما)
    2- حالا یه کلاس بنویس بنام Multiple که دو عدد رو بگیره و با هم ضرب کنه و نتیجه رو برگردونه. اینبار از این پیاده سازی در کنترلر استفاده کن و نتیجه ضرب رو نمایش بده


    کد رو بنویس و اینجا بزار تا بریم ادامه داستان.(فقط کد رو بزاری کافیه. لازم نیست توی یک سایت دیگه هم اپلود کنی)
    آفرین که گوش کردی و کدت رو نوشتی و اینجا گذاشتی.معلومه میخوای واقعا یاد بگیری
    سر کاریه؟؟؟

  9. #9

    نقل قول: مشکل جدی با Dependency Injection

    نقل قول نوشته شده توسط hp1361 مشاهده تاپیک
    سلام

    1- فرقی نمیکنه که از کدوم یکی از دو پیاده سازی استفاده کنی(برای این مثال ما)
    2- حالا یه کلاس بنویس بنام Multiple که دو عدد رو بگیره و با هم ضرب کنه و نتیجه رو برگردونه. اینبار از این پیاده سازی در کنترلر استفاده کن و نتیجه ضرب رو نمایش بده

    کد رو بنویس و اینجا بزار تا بریم ادامه داستان.(فقط کد رو بزاری کافیه. لازم نیست توی یک سایت دیگه هم اپلود کنی)
    آفرین که گوش کردی و کدت رو نوشتی و اینجا گذاشتی.معلومه میخوای واقعا یاد بگیری

    سلام و تشکر

    کد کلاس جدیدم به شکل زیر هست :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;


    namespace Dependency_Injection.Models
    {
    public class Multiple
    {
    public int Number1 { get; set; }
    public int Number2 { get; set; }
    private int _Hit { get; set; }


    public int Hit()
    {
    _Hit = Number1 * Number2;
    return _Hit;
    }
    }
    }
    و از این کلاس و کلاس جمع قبلیم به شکل زیر در کنترلرم استفاده کردم و به view ارسال کردم :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using Dependency_Injection.Models;


    namespace Dependency_Injection.Controllers
    {
    public class HomeController : Controller
    {




    public ActionResult Index()
    {


    CalPlus plus = new CalPlus();
    plus.Number1 = 12;
    plus.Number2 = 122;
    ViewBag.Result = plus.Pluss();


    Multiple multiple = new Multiple();
    multiple.Number1 = 5;
    multiple.Number2 = 6;
    ViewBag.ResultHit = multiple.Hit();
    return View();




    }


    }
    }



    ممنون

  10. #10
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750

    نقل قول: مشکل جدی با Dependency Injection

    سلام

    البته منظورم این بود در کد کنترلرت صرفا از کلاس جدید استفاده کنی(multiple)

    خوب حالا یه کلاس تعریف کن که دو عدد رو بگیره و تقسیم رو روی آن انجام بده و نتیجه رو برگردونه. و از این کلاس در کنترلرت استفاده کن.

    (چون یکی از دوستان نوشته اند سرکاریه مجبورم قبل از اینکه کلاس جدید رو بنویسی مبحث بعدی رو هم بگم که دلسردی بوجود نیاد.

    مسئله : کلاسی داریم که دو عدد رو میگیره و عملیاتی بر روی آن انجام میده و نتیجه رو برمیگردونه. اما اینکه درون این کلاس عملیات به چه صورتی انجام می پذیره وابسته است به نظر مشتری برنامه!
    حالا ما می خواهیم از این کلاس درون برنامه در کنترلر استفاده کنیم.
    درخواست مشتری برنامه در روز اول : لطفا کلاس برنامه دو عدد رو جمع کنه و نتیجه رو نمایش بده.
    درخواست مشتری برنامه در روز دوم: لطفا کلاس برنامه دو عدد رو ضرب کنه و نتیجه رو نمایش بده.
    درخواست مشتری برنامه در روز سوم: لطفا کلاس برنامه دو عدد رو تقسیم کنه و نتیجه رو نمایش بده.

    شما قاعدتا در روز اول کلاس Plus رو می نویسید و از اون در کنترلر استفاده می کنید.

    سوال: در روز دوم چکار می کنید؟
    (این را هم در نظر داشته باشید که مثلا در صد جا از برنامه تون از کلاس Plus استفاده کرده اید. یعنی کد زیر در صد جا استفاده شده)

    CalPlus plus = new CalPlus();
    plus.Number1 = 12;
    plus.Number2 = 122;
    ViewBag.Result = plus.Pluss();

  11. #11
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750

    نقل قول: مشکل جدی با Dependency Injection

    سلام

    البته منظورم این بود در کد کنترلرت صرفا از کلاس جدید استفاده کنی(multiple)

    خوب حالا یه کلاس تعریف کن که دو عدد رو بگیره و تقسیم رو روی آن انجام بده و نتیجه رو برگردونه. و از این کلاس در کنترلرت استفاده کن.

    (چون یکی از دوستان نوشته اند سرکاریه مجبودم قبل از اینکه کلاس جدید رو بنویسی مبحث بعدی رو هم بگم که دلسردی بوجود نیاد.

    سوال: کلاسی داریم که دو عدد رو میگیره و عملیاتی بر روی آن انجام میده و نتیجه رو برمیگردونه. اما اینکه درون این کلاس عملیات به چه صورتی انجام می پذیره وابسته است به نظر مشتری برنامه!
    حالا ما می خواهیم از این کلاس درون برنامه در کنترلر استفاده کنیم.
    درخواست مشتری برنامه در روز اول : لطفا کلاس برنامه دو عدد رو جمع کنه و نتیجه رو نمایش بده.
    درخواست مشتری برنامه در روز دوم: لطفا کلاس برنامه دو عدد رو ضرب کنه و نتیجه رو نمایش بده.
    درخواست مشتری برنامه در روز سوم: لطفا کلاس برنامه دو عدد رو تقسیم کنه و نتیجه رو نمایش بده.

    شما قاعدتا در روز اول کلاس Plus رو می نویسید و از اون در کنترلر استفاده می کنید.

    سوال: در روز دوم چکار می کنید؟
    (این را هم در نظر داشته باشید که مثلا در صد جا از برنامه تون از کلاس Plus استفاده کرده اید. یعنی کد زیر در صد جا استفاده شده)

    CalPlus plus = new CalPlus();
    plus.Number1 = 12;
    plus.Number2 = 122;
    ViewBag.Result = plus.Pluss();


    جوابت رو اینجا بنویس. حالا هرچی که به ذهنت میاد.مهم اینه که فکر کنی و جواب بدی.درست یا اشتباهش مهم نیست

  12. #12

    نقل قول: مشکل جدی با Dependency Injection

    نقل قول نوشته شده توسط hp1361 مشاهده تاپیک
    سلام

    البته منظورم این بود در کد کنترلرت صرفا از کلاس جدید استفاده کنی(multiple)

    خوب حالا یه کلاس تعریف کن که دو عدد رو بگیره و تقسیم رو روی آن انجام بده و نتیجه رو برگردونه. و از این کلاس در کنترلرت استفاده کن.

    (چون یکی از دوستان نوشته اند سرکاریه مجبودم قبل از اینکه کلاس جدید رو بنویسی مبحث بعدی رو هم بگم که دلسردی بوجود نیاد.

    سوال: کلاسی داریم که دو عدد رو میگیره و عملیاتی بر روی آن انجام میده و نتیجه رو برمیگردونه. اما اینکه درون این کلاس عملیات به چه صورتی انجام می پذیره وابسته است به نظر مشتری برنامه!
    حالا ما می خواهیم از این کلاس درون برنامه در کنترلر استفاده کنیم.
    درخواست مشتری برنامه در روز اول : لطفا کلاس برنامه دو عدد رو جمع کنه و نتیجه رو نمایش بده.
    درخواست مشتری برنامه در روز دوم: لطفا کلاس برنامه دو عدد رو ضرب کنه و نتیجه رو نمایش بده.
    درخواست مشتری برنامه در روز سوم: لطفا کلاس برنامه دو عدد رو تقسیم کنه و نتیجه رو نمایش بده.

    شما قاعدتا در روز اول کلاس Plus رو می نویسید و از اون در کنترلر استفاده می کنید.

    سوال: در روز دوم چکار می کنید؟
    (این را هم در نظر داشته باشید که مثلا در صد جا از برنامه تون از کلاس Plus استفاده کرده اید. یعنی کد زیر در صد جا استفاده شده)

    CalPlus plus = new CalPlus();
    plus.Number1 = 12;
    plus.Number2 = 122;
    ViewBag.Result = plus.Pluss();


    جوابت رو اینجا بنویس. حالا هرچی که به ذهنت میاد.مهم اینه که فکر کنی و جواب بدی.درست یا اشتباهش مهم نیست
    سلام

    متوجه منظورتون تا حدی شدم شما این موضوع رو می گید که ما باید کلاس رو جوری بنویسیم که انعطاف پذیر باشه و هر تغییر در اون بدم در اون بازسازی کلاس ما تغییری نداره مثل یک کلاس ارسال ایمیل اگر ما در تمامی فرم ها استفاده کرده باشم و تغییری صورت بگیره یعنی پروژه داغون می شه و معمولا جمع کردن این موضوع زمان زیادی می بره تا درست بشه ...
    اون چیزی که خودنم باید از Interface ها استفاده کرد که وابستگی این بازسازی کلاس رو به خود کلاس اصلی از بین ببریم . بقیش رو من منتظر آموزش شما هستم ...

    ممنون

  13. #13
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750

    نقل قول: مشکل جدی با Dependency Injection

    سلام مجدد.

    جواب سوال رو ندادید. کد روز دوم رو لطفا بنویسید

  14. #14

    نقل قول: مشکل جدی با Dependency Injection

    نقل قول نوشته شده توسط hp1361 مشاهده تاپیک
    سلام مجدد.

    جواب سوال رو ندادید. کد روز دوم رو لطفا بنویسید
    سلام

    برای تقسیم یک کلاس می سازم به نام Division و کد کلاس به شکل زیر می شه :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using Dependency_Injection.Models;


    namespace Dependency_Injection.Controllers
    {
    public class HomeController : Controller
    {




    public ActionResult Index()
    {
    Division div = new Division();
    div.Number1 = 30;
    div.Number2 = 4;
    ViewBag.Div = div.Div();
    return View();




    }


    }
    }

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

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using Dependency_Injection.Models;


    namespace Dependency_Injection.Controllers
    {
    public class HomeController : Controller
    {




    public ActionResult Index()
    {
    Division div = new Division();
    div.Number1 = 30;
    div.Number2 = 4;
    ViewBag.Div = div.Div();
    return View();




    }


    }
    }



    اما جواب سوال من قبلا هم همین کارو می کردم خوب کلاس رو ویرایش می کردم و همه جای برنامه مجبور بودم دستی تغییر بدم ( نتیجه کار هم این می شد گند کشیده می شد توی پروژه خیلی از جاها error می داد و ... )

  15. #15
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750

    نقل قول: مشکل جدی با Dependency Injection

    سلام

    آفرین. می خواستم به همین نتیجه برسی. گند کشیده می شد به همه کد ها. چون باید کل کدها رو تغییر بدیم.

    به نظرت چرا اینجوریه؟

    جواب: چون ما هر کنترلر رو وابسته کردیم به کلاس مورد استفاده. یبار ضرب مورد نیازه. یبار تقسیم مورد نیازه و و و

    حالا مثالی رو برات می زنم که توی همه کتاب های آموزش تزریق وابستگی نوشته شده(البته خارجی هاش!)

    فکر کن بری یک هتل در جزایر قناری! بعد از استحمام بیای ببینی یک سشوار روی میز قرار داره. اما سیم برقش از توی دیوار در اومده.یعنی پریز و دوشاخی وجود نداره. حالا اگر این سشوار بسوزه چکار باید کرد؟ یا اگر بخواهیم سشوار قویتری بزاریم باید چکار کنیم؟(مدل ایرانی فکر نکن که آره کابلش رو با سیم چین میبریم و یکی دیگه رو وصل میکنیم! کار توی هتل باید تمیز باشه)
    یک راه حل اینه که دیوار رو خراب کنیم و سیم برق سشوار جدید رو در دیوار کار بزاریم و دوباره دیوار رو درست کنیم(درست مثل کاری که شما برای کلاس های مورد استفاده خود در کنترلر ها انجام دادید. پاک کردن کلاس ها در هرجا که استفاده شده و نوشتن کدهای جدید شامل ایجاد کلاس جدید و استفاده از توابع اون)

    اما همونطور که در واقعیت میبینیم روش کار اینطور نیست. ما از پریز و دوشاخه استفاده میکنیم و به راحتی سشوار رو عوض می کنیم. حتی مشتری هتل حالا میتونه از سشوار خودش هم استفاده کنه!

    ادامه دارد...

  16. #16
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750

    نقل قول: مشکل جدی با Dependency Injection

    سلام

    وقتیکه ما میایم پریز رو تعریف میکنیم اعلام میکنیم که هر وسیله ای که به برق نیاز داره باید یه همچین دوشاخه ای داشته باشه تا بتونه از خدمات ما استفاده کنه.یعنی دیگه کلاس ارائه برق وابسته به سشوار نیست(که در صورت خرابی کل دیوار رو خراب کنیم) بلکه بقیه وسایل از شرایط ما پیروی باید بکنند تا بتوانند از خدمات برق استفاده کنند. ما یک اینترفیس تعریف میکنیم و میگیم هر وسیله ای با یک دوشاخه میتونه به کلاس ارائه برق وصل بشه و حالا اینکه اون وسیله چطور از برق استفاده میکنه به ما ربطی نداره(به پیاده سازی های مختلف کلاس دریافت دو عدد و بازگرداندن نتیجه فکر کن)

    به این مطالب فکر کن و سوالی اگر داری بپرس تا وارد بحث پایانی بشیم

  17. #17

    نقل قول: مشکل جدی با Dependency Injection

    نقل قول نوشته شده توسط hp1361 مشاهده تاپیک
    سلام

    وقتیکه ما میایم پریز رو تعریف میکنیم اعلام میکنیم که هر وسیله ای که به برق نیاز داره باید یه همچین دوشاخه ای داشته باشه تا بتونه از خدمات ما استفاده کنه.یعنی دیگه کلاس ارائه برق وابسته به سشوار نیست(که در صورت خرابی کل دیوار رو خراب کنیم) بلکه بقیه وسایل از شرایط ما پیروی باید بکنند تا بتوانند از خدمات برق استفاده کنند. ما یک اینترفیس تعریف میکنیم و میگیم هر وسیله ای با یک دوشاخه میتونه به کلاس ارائه برق وصل بشه و حالا اینکه اون وسیله چطور از برق استفاده میکنه به ما ربطی نداره(به پیاده سازی های مختلف کلاس دریافت دو عدد و بازگرداندن نتیجه فکر کن)

    به این مطالب فکر کن و سوالی اگر داری بپرس تا وارد بحث پایانی بشیم
    سلام و تشکر

    تمام مواردی که فرمودید رو کاملا متوجه شدم نهایت می شه کلاس هایی داشته باشیم که مثلا برای ارسال ایمیل هست و smtp ما تغییر می کنه اگر فقط داخل کلاس اون رو تغییر بدیم همه جای برنامه این اعمال بشه نه اینکه Smtp رو از متد ورودی هر جایی که کلاس رو صدا زدیم بخونیم این چیزی که توی ذهنم اومد . سوالی ندارم همه رو متوجه شدم فقط لطفا بعد از تکمیل توضیحات یک مثال عملی هم بزنید خیلی بهتر متوجه می شم

    ممنون

  18. #18
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750

    نقل قول: مشکل جدی با Dependency Injection

    سلام

    برای اینکه دیدت رو یکم بازتر کنم یه سوال می پرسم. البته مرتبط با همین ایمیل که شما اشاره میکنید(البته فقط مثاله)

    سوال:اگر در جاهای مختلف از کلاس ایمیل استفاده کرده باشیم اما نیاز باشه برای بعضی جاها از پیاده سازی شماره یک(درخواست روز اول مشتری رو در نظر بگیر) استفاده کنیم و در بعضی جاهای دیگه از پیاده سازی شماره دو، اونوقت چیکار باید کرد؟

  19. #19

    نقل قول: مشکل جدی با Dependency Injection

    نقل قول نوشته شده توسط hp1361 مشاهده تاپیک
    سلام

    برای اینکه دیدت رو یکم بازتر کنم یه سوال می پرسم. البته مرتبط با همین ایمیل که شما اشاره میکنید(البته فقط مثاله)

    سوال:اگر در جاهای مختلف از کلاس ایمیل استفاده کرده باشیم اما نیاز باشه برای بعضی جاها از پیاده سازی شماره یک(درخواست روز اول مشتری رو در نظر بگیر) استفاده کنیم و در بعضی جاهای دیگه از پیاده سازی شماره دو، اونوقت چیکار باید کرد؟
    سلام

    دقیق نمی دونم ولی فکر می کنم که شاید بشه یک کلاس دیگه ایجاد کرد بین کلاس اصلی و این بازسازی کلاس ما در کنترلر که تمامی متد های ارسال ایمیل و ... رو در اون کلاس صدا بزنیم تا وابستگی کد هایی که شاید در 100 تا کنترلر استفاده کردیم رو به کلاس اصلی از بین ببریم ...

    خیلی ممنون

  20. #20
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750

    نقل قول: مشکل جدی با Dependency Injection

    سلام مجدد

    خوب دیدیم که مشکلات اشاره شده در بالا چقدر اذیت کننده خواهد بود. چطور باید این مشکل رو حل کرد؟

    ما با تعریف یک پریز گفتیم که هر دستگاهی با هر پیاده سازی ای اگر نیاز به برق داره باید یک دوشاخه داشته باشه تا بتونه به برق وصل بشه. به این عمل میگن معکوس سازی وابستگی. یعنی اینکه بقیه دستگاه ها باید وابسته به شرایطی باشند که منه کابل برق اعلام میکنم تا بتونند از برق استفاده کنند.
    اون پریزی که روی دیوار قرار داریم یک Interface است که یک شکلی داره و بقیه دستگاه ها با داشتن شرایط اون پریز میتونند از برق استفاده کنند.

    برای کلاس هامون هم ما باید از یک اینترفیس استفاده کنیم و بگیم هرکس این اینترفیس رو پیاده سازی کرد از اون استفاده خواهیم کرد. حالا اینکه چطور پیاده سازی کنه به من ربطی نداره!

  21. #21

    نقل قول: مشکل جدی با Dependency Injection

    نقل قول نوشته شده توسط hp1361 مشاهده تاپیک
    سلام مجدد

    خوب دیدیم که مشکلات اشاره شده در بالا چقدر اذیت کننده خواهد بود. چطور باید این مشکل رو حل کرد؟

    ما با تعریف یک پریز گفتیم که هر دستگاهی با هر پیاده سازی ای اگر نیاز به برق داره باید یک دوشاخه داشته باشه تا بتونه به برق وصل بشه. به این عمل میگن معکوس سازی وابستگی. یعنی اینکه بقیه دستگاه ها باید وابسته به شرایطی باشند که منه کابل برق اعلام میکنم تا بتونند از برق استفاده کنند.
    اون پریزی که روی دیوار قرار داریم یک Interface است که یک شکلی داره و بقیه دستگاه ها با داشتن شرایط اون پریز میتونند از برق استفاده کنند.

    برای کلاس هامون هم ما باید از یک اینترفیس استفاده کنیم و بگیم هرکس این اینترفیس رو پیاده سازی کرد از اون استفاده خواهیم کرد. حالا اینکه چطور پیاده سازی کنه به من ربطی نداره!
    سلام و تشکر

    کاملا متوجه شدم پس باید برای از بین بردن این وابستگی یک Interface تعریف کرد . لطف می کنید داخل یک مثالی که مرسوم هست و به واقعیت نزدیک تر هست این موارد رو پیاده سازی کنید تا من اگر سوالی برام پیش اومد بپرسم چون الان با توجه به آموزش شما همه چیز رو می دونم ولی پیاده سازیش رو هنوز چون انجام ندادم نمی دونم روند رو چه شکل می تونه باشه

    خیلی ممنون

  22. #22
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750

    نقل قول: مشکل جدی با Dependency Injection

    سلام مجدد

    البته اینم بگم که ما داریم درمورد Dependency Inversion صحبت میکنیم و در نهایت میرسیم به Dependency Injection

    مثال : برنامه ای بنویسید که با استفاده از تابعی که در یک کلاس تعریف شده متنی را در خروجی چاپ نماید؟

    در حالت عادی می نویسیم

    namespace ConsoleApplication1
    {
    class Program
    {
    static void Main(string[] args)
    {
    Console.Write("Hello World!");
    }
    }
    }


    حالا با استفاده از کلاس

    namespace ConsoleApplication1
    {
    public class Message
    {
    public void Print()
    {
    Console.Write("Hello World!");
    }
    }
    }



    namespace ConsoleApplication1
    {
    public class Sender
    {
    public void Send()
    {
    Message objMessage = new Message();
    objMessage.Print();
    }
    }
    }



    namespace ConsoleApplication1
    {
    class Program
    {
    static void Main(string[] args)
    {
    Sender objSender=new Sender();
    objSender.Send();
    }
    }
    }



    از دوتا کلاس استفاده کردم که در ادامه بتونیم بحث Dependency Injection رو هم انجام بدیم

    همونطور که میبینیم کلاس Sender به کلاس Message وابسته است. پس میایم یک اینترفیس تعریف می کنیم

    namespace ConsoleApplication1
    {
    public interface IMessage
    {
    void Print();
    }
    }


    و کلاس ConsoleMessage رو که این اینترفیس رو پیاده سازی میکنه ایجاد می کنیم

    namespace ConsoleApplication1
    {
    public class ConsoleMessage:IMessage
    {
    public void Print()
    {
    Console.Write("Hello World!");
    }
    }
    }


    و کلاس Sender رو به شکل زیر تغییر میدهیم

    namespace ConsoleApplication1
    {
    public class Sender
    {
    public void Send()
    {
    IMessage objMessage=new ConsoleMessage();
    objMessage.Print();
    }
    }
    }


    خوب ما الان اینترفیس تعریف کردیم اما کار خاصی انگار انجام نشده!کماکان داریم از NEW استفاده میکنیم و این یعنی کماکان وابستگی!برای حل این مشکل باید وابستگی رو تزریق کنیم!
    چند مدل تزریق وابستگی داریم که یکی از اونها تزریق در سازنده کلاس است. به شکل زیر

    namespace ConsoleApplication1
    {
    public class Sender
    {
    private readonly IMessage _objMessage;

    public Sender(IMessage objMessage)
    {
    this._objMessage = objMessage;
    }

    public void Send()
    {
    _objMessage.Print();
    }
    }
    }


    اون اتفاق مهمه الان رخ داده! کلاس Sender یک Interface به عنوان ورودی در سازنده خودش میگیره اما نمیدونه که چه کلاسی و به چه صورت اون اینترفیس رو پیاده سازی کرده!
    حالا ما در زمان استفاده از کلاس Sender اون پیاده سازی مورد نظر خودمون رو(در اینجاConsoleMessage) بهش پاس میدیم!

    namespace ConsoleApplication1
    {
    class Program
    {
    static void Main(string[] args)
    {
    ConsoleMessage objConsoleMessage=new ConsoleMessage();
    Sender objSender = new Sender(objConsoleMessage);
    objSender.Send();
    }
    }
    }

    آخرین ویرایش به وسیله hp1361 : دوشنبه 05 خرداد 1393 در 12:42 عصر

  23. #23

    نقل قول: مشکل جدی با Dependency Injection

    سلام

    خیلی خیلی ممنون ; می شه یک تمرین هم که ساده باشه بهم بدید تا من انجام بدم و براتون بزارم حالا کار با دیتابیس باشه یا هر چیز دیگه ...

    تشکر

  24. #24
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750

    نقل قول: مشکل جدی با Dependency Injection

    سلام

    برنامه ای بنویسید که اطلاعات کلاس Product رو با استفاده از کلاس Order در دیتابیس ذخیره نماید.

    کلاس Product شامل چند فیلد بوده و کلاس Order هم تابعی جهت ذخیره سازی آن دارد.

  25. #25

    نقل قول: مشکل جدی با Dependency Injection

    نقل قول نوشته شده توسط hp1361 مشاهده تاپیک
    سلام

    برنامه ای بنویسید که اطلاعات کلاس Product رو با استفاده از کلاس Order در دیتابیس ذخیره نماید.

    کلاس Product شامل چند فیلد بوده و کلاس Order هم تابعی جهت ذخیره سازی آن دارد.
    سلام

    رو سیاهیه اما در این 2 روز چندین تا چیز نوشتم نشد که نشد . مشکلم هم این بود که نمی تونستم تشخیص بدم الان از کدوم کلاس باید اینترفیس بسازم یا اینکه پارامتر هارو چجوری بگیرم و در کدوم تابع ذخیره کنم و ... اگه یک لطفی بکنید و همین مثال رو با یک توضیحی شرح بدید که چطور این وابستگی و کلاس سازنده و ... رو تشخیص بدم برای پیاده سازی خیلی ممنون می شم

    تشکر

  26. #26
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750

    نقل قول: مشکل جدی با Dependency Injection

    سلام

    شما همین تمرین رو بصورت عادی و بدون در نظر گرفتن آموزش ها انجام بدید. با هم میریم جلو

  27. #27

    نقل قول: مشکل جدی با Dependency Injection

    نقل قول نوشته شده توسط hp1361 مشاهده تاپیک
    سلام

    شما همین تمرین رو بصورت عادی و بدون در نظر گرفتن آموزش ها انجام بدید. با هم میریم جلو
    سلام و تشکر

    برای شروع من یک کلاس به نام Product ایجاد کردم به شکل زیر :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;


    namespace Dependency_Injection.Models
    {
    public class Product
    {
    public int id { get; set; }
    public string Name { get; set; }
    public string Price { get; set; }
    public string group { get; set; }
    }
    }
    و کلاس Order هم به شکل زیر :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;


    namespace Dependency_Injection.Models
    {
    public class Order
    {
    public void SaveOrder(Product product)
    {
    DataClassesDataContext db = new DataClassesDataContext();
    db.tbl_products.InsertOnSubmit(new tbl_product
    {
    group=product.group,
    Name=product.Name,
    Price=product.Price
    });
    db.SubmitChanges();
    System.Web.HttpContext.Current.Response.Write("Sub mit Order ;");
    }
    }
    }

    و در کنترلر خودم به شکل زیر دستی مقدار دهی کردم :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using Dependency_Injection.Models;


    namespace Dependency_Injection.Controllers
    {
    public class OrderController : Controller
    {

    public ActionResult Order()
    {
    Product objProduct = new Product();
    Order objOrder = new Models.Order();
    objProduct.Price="1000";
    objProduct.Name="Lamp";
    objProduct.group = "Home";
    objOrder.SaveOrder(objProduct);
    return View();
    }




    }
    }

    خیلی ممنون

  28. #28
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750

    نقل قول: مشکل جدی با Dependency Injection

    سلام

    اولا که هیچ وقت در کد کلاس هات از کد زیر استفاده نکن

    System.Web.HttpContext.Current.Response.Write("Sub mit Order ;");


    چون این کار هم خوانایی کدهات رو پایین میاره و هم تست پذیری کدها رو با مشکل مواجه میکنه(در مورد تست پذیری همینقدر بگم که با استفاده از اون میتونیم محیط واقعی اجرای برنامه رو شبیه سازی کنیم و برنامه رو بقولی زیر بار ببریم و نتیجه کار رو قبل از تحویل برنامه به مشتری ببینیم)

    راستی! چرا از DI می خواهیم استفاده کنیم؟ جواب : توسعه پذیری!

    خوب بریم سراغ مثال شما

    در این مثال شما درون کلاس Order از کلاس DataClassesDataContext استفاده کرده اید. فرض کنیم شما کلاس DataClassesDataContext رو برای کار با دیتابیس SQL نوشته اید و حالا نیاز شده از کلاس دیگه ای بنام DataClassesDataContextMySQL استفاده کنید که برای کار با MySQL نوشته اید! اونوقت همون بحث قبلی پیش میاد. باید تغییراتی رو در کلاس Order اعمال کنیم تا بتونیم از کلاس DataClassesDataContextMySQL استفاده کنیم!

    راه حل چیه؟همون آموزش های بالا!

    ابتدا باید وابستگی رو با استفاده از constructor injection از بین ببریم. لذا داریم:

    public class Order
    {
    private DataClassesDataContext _dataClassesDataContext;

    public Order(DataClassesDataContext dataClassesDataContext)
    {
    _dataClassesDataContext = dataClassesDataContext;
    }

    public void SaveOrder(Product product)
    {
    _dataClassesDataContext.tbl_products.InsertOnSubmi t(new tbl_product
    {
    group = product.group,
    Name = product.Name,
    Price = product.Price
    });
    _dataClassesDataContext.SubmitChanges();
    }
    }
    آخرین ویرایش به وسیله hp1361 : پنج شنبه 08 خرداد 1393 در 21:42 عصر

  29. #29

    نقل قول: مشکل جدی با Dependency Injection

    با سلام
    من فکر میکنم این شیوه آموزش که در این تاپیک داره استفاده میشه خیلی مناسب نباشه.
    من خودم برای دنبال کردن این که تا الان چه نتیجه ای گرفتیم واقعا حوصله ام سر رفت.

    @jaykob:
    یک مثال میزنم امیدوارم مفید واقع بشه.
    در نظر داشته باشید که قراره عملیات CRUD بر روی یک سری اطلاعات انجام بشه و از قبل مشخص نیست که این نوع اطلاعات قراره در چه جایی ذخیره بشن(پایگاه داده،فایل سیستم) و حتی مشخص نیست که قراره چه بیزینس هایی روی این اطلاعات اعمال بشن.
    ما از قبل نمیدونیم و یا احتمال این رو میدیم که در آینده تغییراتی داشته باشیم(مثلا تغییر پایگاه داده)
    برای این کار میایم Interface هایی رو تولید میکنیم که مشخص کنه چه کارهایی باید انجام بشه.
    کلاس های مربوطه رو که از اینترفیس ها ارث برده پیاده میکنیم تا چگونگی اجرای یک فرِآیند رو پیاده کنه.(این کلاس میتونه در یک پروژه خارج از پروژه اصلی باشه)
    حالا بحث اینه که اگه برای استفاده از کلاس مربوطه بیایم یه Instance از اون کلاس رو مستقیما ایجاد بکنیم وابستگی داریم به همون کلاسی که ازش Instance گرفتیم و میخواهیم این وابستگی رو از طریق تزریق وابستگی و انتخاب و ایجاد کلاس در Run Time از بین ببریم.

    فکر کنم توضیحات خیلی کامل تر و بهتر از توضیحات من رو قبلا مطالعه کردید. مثلا واقعا میزنم. (خود من از کد نگاه کردن خیلی سریع تر یاد میگیرم)


    namespace DependencyInjection.Models
    {
    public class BaseEntity
    {
    }
    public class Person : BaseEntity
    {
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    }
    }


    کنترلر:

    namespace DependencyInjection.Controllers
    {
    public class PersonController : BaseController<Person>
    {
    public PersonController(IService<Person> service) : base(service) { }
    }
    }


    namespace DependencyInjection.Controllers
    {
    public class BaseController<T> : Controller where T : BaseEntity
    {
    protected IService<T> Service;
    public BaseController(IService<T> service)
    {
    this.Service = service;
    }
    public ActionResult Index()
    {
    return View(Service.All);
    }

    public ActionResult Insert(T entity)
    {
    Service.Insert(entity);
    return View(); // show custom result
    }

    public ActionResult Update(T entity)
    {
    Service.Update(entity);
    return View(); // show custom result
    }

    public ActionResult Delete(T entity)
    {
    Service.Delete(entity);
    return View(); // show custom result
    }
    }
    }


    سرویس:
    namespace DependencyInjection.Services
    {
    public interface IService<T> : IDisposable where T : BaseEntity
    {
    IQueryable<T> All { get; }
    T Find(params object[] keys);
    void Insert(T entity);
    void Update(T entity);
    void Delete(T entity);
    }
    }

    ریپازیتوری:

    namespace DependencyInjection.Repositories
    {
    public interface IRepository<T> : IDisposable where T : BaseEntity
    {
    IQueryable<T> All { get; }
    T Find(params object[] keys);
    void Insert(T entity);
    void Update(T entity);
    void Delete(T entity);
    }
    }


    دیتا:
    namespace DependencyInjection.Data
    {
    public class DependencyInjectionDbContext : DbContext
    {
    public DependencyInjectionDbContext() : base("DefaultConnection") { }
    public DbSet<Person> Persons { get; set; }
    }
    }


    پیاده سازی ها :

    namespace DependencyInjection.Services
    {
    public class BaseService<T> : IService<T> where T : BaseEntity
    {
    protected IRepository<T> repo;
    public BaseService(IRepository<T> repo)
    {
    this.repo = repo;
    }

    public virtual IQueryable<T> All
    {
    get { return repo.All; }
    }

    public virtual T Find(params object[] keys)
    {
    return repo.Find(keys);
    }

    public virtual void Insert(T entity)
    {
    repo.Insert(entity);
    }

    public virtual void Update(T entity)
    {
    repo.Update(entity);
    }

    public virtual void Delete(T entity)
    {
    repo.Delete(entity);
    }

    public void Dispose()
    {
    repo.Dispose();
    }
    }
    }



    namespace DependencyInjection.Repositories
    {
    public class BaseRepository<T> : IRepository<T> where T : BaseEntity
    {
    protected readonly DbContext context;

    public BaseRepository(DbContext contextFactory)
    {
    context = contextFactory;
    }

    public IQueryable<T> All
    {
    get { return context.Set<T>(); }
    }

    public T Find(params object[] keys)
    {
    return context.Set<T>().Find(keys);
    }

    public void Insert(T entity)
    {
    context.Set<T>().Add(entity);
    context.SaveChanges();
    }

    public void Update(T entity)
    {
    context.Entry(entity).State = System.Data.Entity.EntityState.Modified;
    context.SaveChanges();
    }
    public void Delete(T entity)
    {
    context.Entry(entity).State = System.Data.Entity.EntityState.Deleted;
    context.SaveChanges();
    }

    public void Dispose()
    {
    context.Dispose();
    }
    }
    }


    درواقع کد زیر رو بوسیله تزریق وابستگی ایجاد میکنیم:
    namespace DependencyInjection.Controllers
    {
    public class PersonController : BaseController<Person>
    {
    public PersonController() : this(new BaseService<Person>(new BaseRepository<Person>(new DependencyInjectionDbContext()))) { }
    }
    }
    نگو به سرنوشت میبازی - تو بخوای فردا رو میسازی

  30. #30

    نقل قول: مشکل جدی با Dependency Injection

    نقل قول نوشته شده توسط hp1361 مشاهده تاپیک
    سلام

    اولا که هیچ وقت در کد کلاس هات از کد زیر استفاده نکن

    System.Web.HttpContext.Current.Response.Write("Sub mit Order ;");


    چون این کار هم خوانایی کدهات رو پایین میاره و هم تست پذیری کدها رو با مشکل مواجه میکنه(در مورد تست پذیری همینقدر بگم که با استفاده از اون میتونیم محیط واقعی اجرای برنامه رو شبیه سازی کنیم و برنامه رو بقولی زیر بار ببریم و نتیجه کار رو قبل از تحویل برنامه به مشتری ببینیم)

    راستی! چرا از DI می خواهیم استفاده کنیم؟ جواب : توسعه پذیری!

    خوب بریم سراغ مثال شما

    در این مثال شما درون کلاس Order از کلاس DataClassesDataContext استفاده کرده اید. فرض کنیم شما کلاس DataClassesDataContext رو برای کار با دیتابیس SQL نوشته اید و حالا نیاز شده از کلاس دیگه ای بنام DataClassesDataContextMySQL استفاده کنید که برای کار با MySQL نوشته اید! اونوقت همون بحث قبلی پیش میاد. باید تغییراتی رو در کلاس Order اعمال کنیم تا بتونیم از کلاس DataClassesDataContextMySQL استفاده کنیم!

    راه حل چیه؟همون آموزش های بالا!

    ابتدا باید وابستگی رو با استفاده از constructor injection از بین ببریم. لذا داریم:

    public class Order
    {
    private DataClassesDataContext _dataClassesDataContext;

    public Order(DataClassesDataContext dataClassesDataContext)
    {
    _dataClassesDataContext = dataClassesDataContext;
    }

    public void SaveOrder(Product product)
    {
    _dataClassesDataContext.tbl_products.InsertOnSubmi t(new tbl_product
    {
    group = product.group,
    Name = product.Name,
    Price = product.Price
    });
    _dataClassesDataContext.SubmitChanges();
    }
    }
    سلام و تشکر

    بله اون خط رو نوشتم که فقط خروجی رو مطمئن بشم اوکی هست توی کلاس های واقعی معمولا یک پروپرتی Result در نظر می گیریم که خروجی رو از اون داشته باشم .

    الان کاملا متوجه شدم یعنی ما هر کجای برنامه که دیدم امکان داره در آینده تغییری بکنه مثلا دیتابیس یا ... باید این تزریق وابستگی رو انجام بدیم

    من از اول توضیح می دم شما بفرمایید درست هست یا نه :

    اینترفیس من :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;


    namespace Dependency_Injection
    {
    public interface IDataClassContext
    {
    void DataClassesDataContext();
    }
    }


    کلاس Order من هم به شکل زیر می شه :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;


    namespace Dependency_Injection.Models
    {
    public class Order
    {
    public string Result { get; set; }
    private IDataClassContext _dataclassdatacontext;
    public Order(IDataClassContext dataclassdatacontext)
    {
    _dataclassdatacontext = dataclassdatacontext;
    }


    public void SaveOrder(Product product)
    {

    _dataclassdatacontext.tbl_products.InsertOnSubmit( new tbl_product
    {
    group=product.group,
    Name=product.Name,
    Price=product.Price
    });
    db.SubmitChanges();
    Result = "Submit Order ";
    }
    }
    }


    البته این DataClass من کلاس Linq To Sql هست و من نتونستم این کلاس رو از اینترفیسم مشتق کنم برای این مورد باید چه کاری انجام بدم ؟

    نکته بعدی این در یک پروژه مثلا CMS چه وابستگی هایی هست معمولا ؟ مثلا برای اخبار خوب کلاس ثبت اخبار وابسته به کلاس DataContext ما هست که باید از بین ببریم این مورد رو ، دیگه چه چیز هایی وجود دارد ؟ خیلی دوست دارم مثال های بیشتری باشه تا با موارد مختلف بیشتر آشنا بشم ...

    خیلی ممنون

  31. #31

    نقل قول: مشکل جدی با Dependency Injection

    نقل قول نوشته شده توسط raziee مشاهده تاپیک
    با سلام
    من فکر میکنم این شیوه آموزش که در این تاپیک داره استفاده میشه خیلی مناسب نباشه.
    من خودم برای دنبال کردن این که تا الان چه نتیجه ای گرفتیم واقعا حوصله ام سر رفت.

    @jaykob:
    یک مثال میزنم امیدوارم مفید واقع بشه.
    در نظر داشته باشید که قراره عملیات CRUD بر روی یک سری اطلاعات انجام بشه و از قبل مشخص نیست که این نوع اطلاعات قراره در چه جایی ذخیره بشن(پایگاه داده،فایل سیستم) و حتی مشخص نیست که قراره چه بیزینس هایی روی این اطلاعات اعمال بشن.
    ما از قبل نمیدونیم و یا احتمال این رو میدیم که در آینده تغییراتی داشته باشیم(مثلا تغییر پایگاه داده)
    برای این کار میایم Interface هایی رو تولید میکنیم که مشخص کنه چه کارهایی باید انجام بشه.
    کلاس های مربوطه رو که از اینترفیس ها ارث برده پیاده میکنیم تا چگونگی اجرای یک فرِآیند رو پیاده کنه.(این کلاس میتونه در یک پروژه خارج از پروژه اصلی باشه)
    حالا بحث اینه که اگه برای استفاده از کلاس مربوطه بیایم یه Instance از اون کلاس رو مستقیما ایجاد بکنیم وابستگی داریم به همون کلاسی که ازش Instance گرفتیم و میخواهیم این وابستگی رو از طریق تزریق وابستگی و انتخاب و ایجاد کلاس در Run Time از بین ببریم.

    فکر کنم توضیحات خیلی کامل تر و بهتر از توضیحات من رو قبلا مطالعه کردید. مثلا واقعا میزنم. (خود من از کد نگاه کردن خیلی سریع تر یاد میگیرم)


    سلام

    خیلی ممنون که جواب من رو دادید . حقیقت من با EF Code First در حد مبتدی آشنا هستم و کد های شما رو درک نکردم باید ببخشید ولی فکر کنم برای شروع نیاز دارم که یک مثال ساده تر و ملموس تر مثلا یکی از امکانات یک cms یا سایت رو یاد بگیریم تا بعدا که دارم بیشتر ef یاد می گیریم این موارد رو هم متوجه بشیم

    تشکر

  32. #32
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750

    نقل قول: مشکل جدی با Dependency Injection

    سلام

    @raziee
    سلام مهندس. اتفاقا یکی از نگرانی های اصلی من در پاسخ های این تاپیک همین موضوع از حوصله خخارج بودن بود!اما چاره ای جز این نبود و نوشتن پاسخ های کلی باعث پیچیده تر شدن موضوع بشه و نوشتنش هم سخت بود

    کما اینکه من خودم در ایتدا بارهای بار نوشته های مهندس نصیری رو خوندم اما متوجه نمیشدم. اما حالا وقتی می خونم به راحتی نسبت به قبل قابل هضمه.

    @jaykob
    دوست عزیز دیدم که در تاپیک های دیگه در مورد UOF هم سوال کردی. پس باید آستین ها رو بالا بزنی و FE رو یاد بگیری که کلا بکارت میاد. کدهایی هم که بالا دیدی دوست عزیز Raziee نوشتن نیاز داره با پایه های زبان #C آشنا بشی.

    شما قدم بعدی رو هم در کدی که من قرار دادم رو انجام دادید و به خوبی از Interface استفاده کرده اید.

  33. #33

    نقل قول: مشکل جدی با Dependency Injection

    نقل قول نوشته شده توسط hp1361 مشاهده تاپیک
    سلام

    @raziee
    سلام مهندس. اتفاقا یکی از نگرانی های اصلی من در پاسخ های این تاپیک همین موضوع از حوصله خخارج بودن بود!اما چاره ای جز این نبود و نوشتن پاسخ های کلی باعث پیچیده تر شدن موضوع بشه و نوشتنش هم سخت بود

    کما اینکه من خودم در ایتدا بارهای بار نوشته های مهندس نصیری رو خوندم اما متوجه نمیشدم. اما حالا وقتی می خونم به راحتی نسبت به قبل قابل هضمه.

    @jaykob
    دوست عزیز دیدم که در تاپیک های دیگه در مورد UOF هم سوال کردی. پس باید آستین ها رو بالا بزنی و FE رو یاد بگیری که کلا بکارت میاد. کدهایی هم که بالا دیدی دوست عزیز Raziee نوشتن نیاز داره با پایه های زبان #C آشنا بشی.

    شما قدم بعدی رو هم در کدی که من قرار دادم رو انجام دادید و به خوبی از Interface استفاده کرده اید.
    سلام

    حقیقت من که واقعا یاد گرفتم و فکر کنم بهترین راه هم برای من که ذهنم که کلا دور بود از قضیه همین بود ...

    خیلی ممنون . بله دارم روی EF کار می کنم و باید روی Unit Of Work هم کار رو شروع کنم و چشم حتما این کار رو خواهم کرد ...

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

    و اگر جواب این موردی رو هم که در آخر گفتم بدید ممنون می شم چون احساس می کنم یک مثال یا مورد دیگه حل کنم راحت بتونم مقالات آموزشی دیگرو بخونم ...

    نکته بعدی این در یک پروژه مثلا CMS چه وابستگی هایی هست معمولا ؟ مثلا برای اخبار خوب کلاس ثبت اخبار وابسته به کلاس DataContext ما هست که باید از بین ببریم این مورد رو ، دیگه چه چیز هایی وجود دارد ؟ خیلی دوست دارم مثال های بیشتری باشه تا با موارد مختلف بیشتر آشنا بشم ...
    تشکر

  34. #34
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750

    نقل قول: مشکل جدی با Dependency Injection

    سلام

    اگر مطالب آموزشی آقای نصیری رو بادقت دوباره بخونید به جواب سوالاتتون خواهید رسید.

    برای یک پروژه بطور کلی چند لایه ایجاد میکنیم
    DomainClasess که معمولاً از نوع ClassLibrary تعریف میکنیم که محلی است برای Entity های برنامه
    DataLayer که معمولا از نوع ClassLibrary تعریف می کنیم که محلی است برای تعریف عملیات CRUD مربوط به بانک اطلاعاتی
    Services که معمولاً از نوع VlassLibrary تعریف میکنیم که سرویس های مورد نیاز قسمت های مختلف برنامه رو ارائه میده(شما فرض کن توابع و متد های مورد نیاز در اینجا متمرکز میکنیم)
    و Web که میتونه Asp.NET Web MVC باشه

    شما در DataLayer به بانک دسترسی دارید و در Services نیز با استفاده از DataLayer و نیز DomainClasess سرویس هایی رو ارائه میدیم. در Web هم از تمام این موارد استفاده خواهیم کرد. برای هر کدوم از اینها اگر نیاز باشه که حتما هست عملیات DI انجام خواهد شد.

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

  1. فوری - مشکل جدی در ارتباط با Restore کردن
    نوشته شده توسط kathy11ir در بخش SQL Server
    پاسخ: 5
    آخرین پست: یک شنبه 07 خرداد 1385, 08:05 صبح
  2. یک مشکل جدی در Binding
    نوشته شده توسط mahdi_negahi در بخش ASP.NET Web Forms
    پاسخ: 6
    آخرین پست: سه شنبه 23 اسفند 1384, 13:00 عصر
  3. مشکل جدی با اکسس و اعمال تغییرات
    نوشته شده توسط newdesign در بخش بانک های اطلاعاتی در Delphi
    پاسخ: 12
    آخرین پست: پنج شنبه 26 آبان 1384, 01:46 صبح
  4. مشکل جدی در زمینه provider مربوط به adodc
    نوشته شده توسط amirhosein در بخش برنامه نویسی در 6 VB
    پاسخ: 10
    آخرین پست: چهارشنبه 15 تیر 1384, 22:56 عصر
  5. یک مشکل جدی ( Delphi & SQL)
    نوشته شده توسط سعود در بخش بانک های اطلاعاتی در Delphi
    پاسخ: 1
    آخرین پست: شنبه 28 آذر 1383, 00:28 صبح

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

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