ورود

View Full Version : حل مشکل No parameterless constructor در استفاده از DI



jaykob
یک شنبه 11 خرداد 1393, 12:28 عصر
سلام دوستان

من از DI در یک کنترلرم استفاده کردم اما بعد از اجرا خطای No parameterless constructor defined for this object رو می گیریم هر چی جستجو کردم نفهمیدم برای چی هست
کد کنترلرم هم به شکل زیر است :


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


namespace Register_DI_UnitTest.Controllers
{
public class RegisterController : Controller
{
private readonly IUserRepository userrepository;


public RegisterController(IUserRepository repositoryparam)
{
this.userrepository = repositoryparam;
}


[HttpGet]
public ViewResult Index()
{
return View();
}


[HttpPost]
public ActionResult Index(Register register)
{
if (ModelState.IsValid)
{
this.userrepository.AddUser(register);
return RedirectToAction("Message");
}


return View();
}


public string Message()
{
return "اطلاعات با موفقیت ثبت شدند";
}
}
}

ممنون

hp1361
یک شنبه 11 خرداد 1393, 14:45 عصر
سلام

از چه ابزاری جهت تزریق وابستگی استفاده میکنید؟StructureMap,Ninject,....?

jaykob
یک شنبه 11 خرداد 1393, 18:47 عصر
سلام

از چه ابزاری جهت تزریق وابستگی استفاده میکنید؟StructureMap,Ninject,....?

سلام

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

ممنون می شم راهنمایی کنید ...

jaykob
دوشنبه 12 خرداد 1393, 10:24 صبح
سلام

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

این متد آخری فایل کانفیگ Ninject


private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IUserRepository>().To<UserRepository>();
}


تشکر

hp1361
دوشنبه 12 خرداد 1393, 12:17 عصر
سلام

شما وقتی DI رو قصد دارید انجام بدید، بعد از اینکه Interface ها رو تعریف کردید و یک کلاسی رو نیز با اون پیاده سازی کردید، حالا باید به برنامه یجوری بفهمونید که وقتی یک کنترلر از یک اینترفیسی قراره استفاده کنه از کدوم پیاده سازیش استفاده کنه.
اگر بخواهیم این کار رو بصورت دستی انجام بدیم خسته کننده خواهد بود، لذا از ابزاری استفاده ممیکنیم که این کارهارو بصورت خودکار انجام بده. مثلا Ninject و یا StructureMap
اگر سری به برنامه IRIS در Dotnettips بزنی میبینی که از StructureMap.MVC استفاده کرده که کارهارو خیلی ساده تر میکنه.
با Nuget ابزار StructureMap.MVC5 رو بگیر خودش چند تا فایل تعریف میکنه. با استفاده از راهنماش به راحتی میتونی پیاده سازیش کنی

موفق باشی