2012-08-31 8 views
8

Ich habe eine ASP.NET MVC 4-Anwendung, die Unit of Work Pattern implementieren soll.ASP.NET MVC WebApi: Kein parameterloser Konstruktor für dieses Objekt definiert

In meinem Web-Projekt habe ich:

IocConfig.cs

using System.Web.Http; 
using NinjectMVC.Data; 
using NinjectMVC.Data.Contracts; 
using Ninject; 


namespace NinjectMVC 
{ 
    public class IocConfig 
    { 
     public static void RegisterIoc(HttpConfiguration config) 
     { 
      var kernel = new StandardKernel(); // Ninject IoC 

      // These registrations are "per instance request". 
      // See http://blog.bobcravens.com/2010/03/ninject-life-cycle-management-or-scoping/ 

      kernel.Bind<RepositoryFactories>().To<RepositoryFactories>() 
       .InSingletonScope(); 

      kernel.Bind<IRepositoryProvider>().To<RepositoryProvider>(); 
      kernel.Bind<INinjectMVCUow>().To<NinjectMVCUow>(); 

      // Tell WebApi how to use our Ninject IoC 
      config.DependencyResolver = new NinjectDependencyResolver(kernel); 
     } 
    } 
} 

Global.asax

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Http; 
using System.Web.Mvc; 
using System.Web.Optimization; 
using System.Web.Routing; 

namespace NinjectMVC 
{ 
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801 

    public class MvcApplication : System.Web.HttpApplication 
    { 
     protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 

      // Tell WebApi to use our custom Ioc (Ninject) 
      IocConfig.RegisterIoc(GlobalConfiguration.Configuration); 

      WebApiConfig.Register(GlobalConfiguration.Configuration); 
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 
      BundleConfig.RegisterBundles(BundleTable.Bundles); 
      AuthConfig.RegisterAuth(); 
     } 
    } 
} 

PersonsController.cs

using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Web.Http; 
using NinjectMVC.Data.Contracts; 
using NinjectMVC.Model; 

namespace NinjectMVC.Controllers 
{ 
    public class PersonsController : ApiControllerBase 
    { 
     public PersonsController(INinjectMVCUow uow) 
     { 
      Uow = uow; 
     } 

     #region OData Future: IQueryable<T> 
     //[Queryable] 
     // public IQueryable<Person> Get() 
     #endregion 

     // GET /api/persons 
     public IEnumerable<Person> Get() 
     { 
      return Uow.Persons.GetAll() 
       .OrderBy(p => p.FirstName); 
     } 

     // GET /api/persons/5 
     public Person Get(int id) 
     { 
      var person = Uow.Persons.GetById(id); 
      if (person != null) return person; 
      throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound)); 
     } 

     // OData: GET /api/persons/?firstname=\'Hans\'' 
     // With OData query syntax we would not need such methods 
     // /api/persons/getbyfirstname?value=Joe1 
     [ActionName("getbyfirstname")] 
     public Person GetByFirstName(string value) 
     { 
      var person = Uow.Persons.GetAll() 
       .FirstOrDefault(p => p.FirstName.StartsWith(value)); 

      if (person != null) return person; 
      throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound)); 
     } 

     // Update an existing person 
     // PUT /api/persons/ 
     public HttpResponseMessage Put(Person person) 
     { 
      Uow.Persons.Update(person); 
      Uow.Commit(); 
      return new HttpResponseMessage(HttpStatusCode.NoContent); 
     } 

    } 
} 

Wenn ich versuche, zu surfen : http://www.domain.com/Persons/Get Ich bekomme:

Kein parameterloser Konstruktor für dieses Objekt definiert.

Gibt es irgendwelche Sachen, die ich verpasst habe? Ich würde jede Hilfe schätzen. Hier

ist die Zip-Datei des Projekts für eine bessere Referenzen:

http://filebin.ca/E6aoOkaUpbQ/NinjectMVC.zip

Antwort

8

Wep.API verwendet eine andere IDependencyResolver als die MVC-Framework.

Wenn Sie die HttpConfiguration.DependencyResolver verwenden, funktioniert es nur für ApiControllers. Aber Ihr ApiControllerBase stammt von Controller ...

Also sollte Ihre ApiControllerBase erben von ApiController.

Ändern Sie es in Ihrem ApiBaseController.cs:

public abstract class ApiControllerBase : ApiController 
{ 
} 

Wenn Sie Abhängigkeiten zu regelmäßigen Controller abgeleiteten Klassen injizieren wollen Sie (in Ihrem IocConfig) verwenden müssen:

System.Web.Mvc.DependencyResolver.SetResolver(new NinjectMvcDependencyResolver(container)); 

Beachten Sie, dass in In diesem Fall können Sie nicht Ihre NinjectDependencyResolver verwenden, weil es für ist.

Sie brauchen also eine andere NinjectMvcDependencyResolver, die System.Web.Mvc.IDependencyResolver implementieren sollte.

+0

Danke, eigentlich möchte ich sie für normale Controller verwenden. Weißt du, was ich anstelle von HttpConfiguration.DependencyResolver verwenden soll? Vielen Dank – VAAA

+0

Danke gerade hinzugefügt diese Zeile, aber ich bekomme den folgenden Fehler: Der Typ NinjectMVC.NinjectDependencyResolver scheint Microsoft.Practices.ServiceLocation.IServiceLocator nicht zu implementieren. Irgendeine Ahnung? – VAAA

+0

@VAAA sehe meine aktualisierte Antwort. – nemesv

0

Ich weiß, das ist ein alter Thread, aber das könnte für jemanden nützlich sein. :) In meinem Fall fehlte die DependencyResolver auf NinjectWebCommon.cs. Ich folgte diesem article und alles hat gut funktioniert.

RegisterServices(kernel); 
GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel); 
return kernel; 
Verwandte Themen