PDA

View Full Version : سوال: عدم پاسح webApi هنگام استفاده از لایه Service



r4hgozar
دوشنبه 18 خرداد 1394, 00:49 صبح
سلام.
من تازه کار با WebApi رو شروع کردم.
دارم یک مقاله رو می خونم و طبق اون کار رو یاد میگیرم.
من در ابتدا از یک کنترلر استفاده کردم بصورت زیر

public class EmployeController : ApiController
{
public string[] Get()
{
return new string[]
{
"Hello",
"Nabi"
};


}
}


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




public class ContactRepository
{
private const string CashKey = "ContactStrore";


public ContactRepository()
{
var ctx = HttpContext.Current;


if (ctx != null)
{
if (ctx.Cache[CashKey] == null)
{
var contacts = new Contact[]
{
new Contact
{
Id = 1, Name = "Glenn Block"
},
new Contact
{
Id = 2, Name = "Dan Roth"
}
};


ctx.Cache[CashKey] = contacts;
}
}


}


public Contact[] GetallContacts()
{
var ctx = HttpContext.Current;


if (ctx != null)
{
return (Contact[])ctx.Cache[CashKey];
}


return new Contact[]
{
new Contact
{
Id = 0,
Name = "Placeholder"
}
};


}


public bool SaveContact(Contact contact)
{
var ctx = HttpContext.Current;
if (ctx != null)
{
try
{
var currentData = ((Contact[])ctx.Cache[CashKey]).ToList();
currentData.Add(contact);
ctx.Cache[CashKey] = currentData.ToArray();
return true;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
return false;
}
}
return false;
}
}




این هم کنترلر API من


private ContactRepository _contact;


public ContactController(ContactRepository contact)
{
_contact = contact;
}


public Contact[] Get()
{
return this._contact.GetallContacts();
}





This XML file does not appear to have any style information associated with it. The document tree is shown below. <Error><Message>An error has occurred.</Message><ExceptionMessage>An error occurred when trying to create a controller of type 'ContactController'. Make sure that the controller has a parameterless public constructor.</ExceptionMessage><ExceptionType>System.InvalidOperationException</ExceptionType><StackTrace> at System.Web.Http.Dispatcher.DefaultHttpControllerAc tivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) at System.Web.Http.Controllers.HttpControllerDescript or.CreateController(HttpRequestMessage request) at System.Web.Http.Dispatcher.HttpControllerDispatche r.<SendAsync>d__1.MoveNext()</StackTrace><InnerException><Message>An error has occurred.</Message><ExceptionMessage>Type 'TestApi.Web.Controllers.ContactController' does not have a default constructor</ExceptionMessage><ExceptionType>System.ArgumentException</ExceptionType><StackTrace> at System.Linq.Expressions.Expression.New(Type type) at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) at System.Web.Http.Dispatcher.DefaultHttpControllerAc tivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator) at System.Web.Http.Dispatcher.DefaultHttpControllerAc tivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)</StackTrace></InnerException></Error>

itsurge
سه شنبه 19 خرداد 1394, 00:42 صبح
سلام دوست عزیز مشکل در تزریق وابستگی Repository شما می باشد این روش تزریق کاملا اشتباه می باشد تزریق وابستگی اولا توسط interface ها صورت می گیرد در ثانی توسط کتابخانه های مشخصی مثل autofac

r4hgozar
سه شنبه 19 خرداد 1394, 10:32 صبح
ممنون.
اما به خاطر این نیست. من همیشه دارم از تزریق وابستگی با اینترفیس و ninject کار می کنم. این کد هام طبق مثال کتاب اما نمی دونم چرا جواب نمیده.
موفق باشید

مهدی کرامتی
سه شنبه 19 خرداد 1394, 10:40 صبح
زبون بسته خودش داره میگه مشکلت چیه:
An error occurred when trying to create a controller of type 'ContactController'. Make sure that the controller has a parameterless public constructor
داره میگه شما Constructor بدون پارامتر باید داشته باشید (که در کلاس فوق ندارید).

r4hgozar
سه شنبه 19 خرداد 1394, 10:58 صبح
واقعا ممنون استاد. دقت نکرده بودم :لبخند:

این خط باید اضافه میشد


public ContactController()
{
this._contact = new ContactRepository();
}

salar IT man
پنج شنبه 21 خرداد 1394, 15:37 عصر
ممنون.
اما به خاطر این نیست. من همیشه دارم از تزریق وابستگی با اینترفیس و ninject کار می کنم. این کد هام طبق مثال کتاب اما نمی دونم چرا جواب نمیده.
موفق باشید

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

hakim22
پنج شنبه 21 خرداد 1394, 20:36 عصر
Ninject در نسخه های جدیدش برای تزریق وابستگی درون Web Api نیاز به دو افزونه Ninject Web Api و Ninject WebApi WebHost داره (اگر جستجو کنید در Nuget هست) اینها رو به پروژه اضافه کنید.

r4hgozar
جمعه 22 خرداد 1394, 10:11 صبح
Ninject در نسخه های جدیدش برای تزریق وابستگی درون Web Api نیاز به دو افزونه Ninject Web Api و Ninject WebApi WebHost داره (اگر جستجو کنید در Nuget هست) اینها رو به پروژه اضافه کنید.

سلام.

Ninject Web Api رو می دونستم و نصب کردم اما Ninject WebApi WebHost رو نمی دونستم.
ممنون.