PDA

View Full Version : سوال: Ninject چیست ؟



kavayo
جمعه 29 آذر 1392, 12:13 عصر
میدونم که Ninject برای کاهش وابستگی ها استفاده میشه اما نمیدونم چطوری و کجا و چرا استفاده میشه؟
اگه میشه با ذکر مثال توضیح بدید.

hakim22
جمعه 29 آذر 1392, 20:35 عصر
در اصل Ninject یک IoC Container محبوب است. منظور از IoC عبارت Inversion of Control است. معکوس سازی کنترل به این معنی است که یک کلاس خودش کلاسهای مورد نیازش را باز سازی نمیکند. بلکه Ninject بالاتر از همه ی کلاسها اجرا میشود و کارش نمونه سازی از کلاسهاست.

فرض کنید شما یک کلاس برای Userدارید. بعد در کنترلر مربوط به Account نیاز به ساختن یک نمونه (Instance) از کلاس Userدارید. اگر ابزار Ninject را به درستی تنظیم کرده باشید کلاس نمونه ی مورد نیاز شما را بازسازی میکند . کار شما فقط این است که کلاسها را بر اساس Interface بسازید و بعدا از Interface ها برای تعریف متغیرها استفاده کنید.

Ninject کارش Dependency Injection است. یعنی کلاسهایی که به نمونه ی آنها نیاز دارید پیدا میکند و آنها را میسازد. در عمل بعد از فعال سازی Ninject هیچ جا از دستور new استفاده نخواهید کرد.

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

ابزار IoC وقتی کارایی دارند که شی اصلی و متدهای آنها را از هم جدا کرده باشید. مثلا کلاسی با عنوان UserServices داشته باشید که عملیات حذف و اضافه و تغییر اطلاعات یک user را در بانک انجام میدهد. بهترین اگو هم Service/Repostiory است. باید این کلاس را با یک Interface مثلا با نام IUserServices تعریف کرده باشید. حالا کافی است در متد Constructor کنترلری که با User ها کار میکند (مثلا UserController) آرگومانی از نوع IUserServices تعریف کنید.

Cybersilent
یک شنبه 08 دی 1392, 14:36 عصر
می تونید این آموزش رو برای فهمیدن نحوه استفاده از اون در یک مثال کاربردی دنبال کنید.
http://www.prideparrot.com/blog/archive/2012/12/how_to_create_a_simple_blog_part1
از صفحه 3 به بعد کار با Ninject رو شروع کرده.

r4hgozar
یک شنبه 21 دی 1393, 22:15 عصر
سلام

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


using JustBlog.Core;
using System.Web.Mvc;


namespace JustBlog.Controllers
{
public class BlogController
{
private readonly IBlogRepository _blogRepository;


public BlogController(IBlogRepository blogRepository)
{
_blogRepository = blogRepository;
}
}
}

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

[Inject]
Public IBlogService _blogRepository;

ممنون میشم راهنمایی کنید.
به اروری هم که می خوارم ارور زیره.
http://s4.picofile.com/file/8163226634/error.png

aroshanzamir
یک شنبه 21 دی 1393, 22:21 عصر
در اصل Ninject یک IoC Container محبوب است. منظور از IoC عبارت Inversion of Control است. معکوس سازی کنترل به این معنی است که یک کلاس خودش کلاسهای مورد نیازش را باز سازی نمیکند. بلکه Ninject بالاتر از همه ی کلاسها اجرا میشود و کارش نمونه سازی از کلاسهاست.

فرض کنید شما یک کلاس برای Userدارید. بعد در کنترلر مربوط به Account نیاز به ساختن یک نمونه (Instance) از کلاس Userدارید. اگر ابزار Ninject را به درستی تنظیم کرده باشید کلاس نمونه ی مورد نیاز شما را بازسازی میکند . کار شما فقط این است که کلاسها را بر اساس Interface بسازید و بعدا از Interface ها برای تعریف متغیرها استفاده کنید.

Ninject کارش Dependency Injection است. یعنی کلاسهایی که به نمونه ی آنها نیاز دارید پیدا میکند و آنها را میسازد. در عمل بعد از فعال سازی Ninject هیچ جا از دستور new استفاده نخواهید کرد.

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

ابزار IoC وقتی کارایی دارند که شی اصلی و متدهای آنها را از هم جدا کرده باشید. مثلا کلاسی با عنوان UserServices داشته باشید که عملیات حذف و اضافه و تغییر اطلاعات یک user را در بانک انجام میدهد. بهترین اگو هم Service/Repostiory است. باید این کلاس را با یک Interface مثلا با نام IUserServices تعریف کرده باشید. حالا کافی است در متد Constructor کنترلری که با User ها کار میکند (مثلا UserController) آرگومانی از نوع IUserServices تعریف کنید.

سلام ; منظورت از این دو خط چیه ؟-1- یک کلاس خودش کلاسهای مورد نیازش را باز سازی نمیکند
-2-
از Interface ها برای تعریف متغیرها استفاده کنید؟

متشکرم

r4hgozar
دوشنبه 22 دی 1393, 11:05 صبح
کسی از دوستان تجربه این کار رو نداره؟؟

hakim22
دوشنبه 22 دی 1393, 16:01 عصر
منظور از معکوس کردن کنترل یا به عبارتی "Inversion Of Control" یا IoC این است که شما اختیار بعضی از کارها را از دست خودتون خارج کنید و آن را به سیستم واگذار کنید.

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

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

نینجکت یک IoC Container است. یعنی ابزاری است که چشم های الکترونیکی سیستم شما رو مدیریت میکنه و ساخته شدن و از بین رفتن کلاسهارو خودش کنترل میکنه و اینکار رو با استفاده از روش Dependency Injection انجام میده. در این روش شما در هر کلاس مشخص می کنید که به چه کلاسهایی وابسته است و بقیه ی کارها در زمان اجرا توسط نینجکت مدیریت میشه.

aroshanzamir
دوشنبه 22 دی 1393, 16:34 عصر
سلام hakim22 (http://barnamenevis.org/member.php?244339-hakim22)
بینهایت سپاسگزارم از اینکه وقت میزاری و پاسخ های پر محتوای میدی
تشکر

hakim22
سه شنبه 23 دی 1393, 09:31 صبح
خواهش میشه

Mousavmousab
دوشنبه 31 خرداد 1395, 16:35 عصر
سلام
ما دیر تر رسیدیم. ولی واقعا توضیح خوبی دادی.
2تا بی نهایت دمت گرم.