2012-08-31 14 views
8

Possiedo un'applicazione ASP.NET MVC 4 che voglio implementare Modello unità di lavoro.ASP.NET MVC WebApi: nessun costruttore parametrico definito per questo oggetto

Nel mio progetto Web ho:

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); 
     } 

    } 
} 

Quando provo a navigare : http://www.domain.com/Persons/Get Im ottenendo:

Nessun costruttore parametrico definito per questo oggetto.

C'è qualcosa che mi è sfuggito? Gradirei qualsiasi aiuto.

Ecco il file zip del progetto per i riferimenti migliori:

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

risposta

8

Wep.API utilizza un diverso IDependencyResolver rispetto al framework MVC.

Quando si utilizza il HttpConfiguration.DependencyResolver funziona solo per ApiController. Ma il tuo ApiControllerBase deriva da Controller ...

Quindi il tuo ApiControllerBase dovrebbe ereditare da ApiController.

cambiamento nelle vostre ApiBaseController.cs:

public abstract class ApiControllerBase : ApiController 
{ 
} 

Se si vuole iniettare le dipendenze a regolari Controller classi derivate è necessario utilizzare (nel IocConfig):

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

Si noti che in In questo caso non è possibile utilizzare il numero NinjectDependencyResolver perché è per ApiControllers.

Quindi è necessario un diverso NinjectMvcDependencyResolver che dovrebbe implementare System.Web.Mvc.IDependencyResolver.

public class NinjectMvcDependencyResolver: NinjectDependencyScope, 
              System.Web.Mvc.IDependencyResolver 
{ 
    private IKernel kernel; 

    public NinjectDependencyResolver(IKernel kernel) 
     : base(kernel) 
    { 
     this.kernel = kernel; 
    } 
} 
+0

Grazie, in realtà voglio usarli per il normale controller. Sai cosa dovrei usare al posto di HttpConfiguration.DependencyResolver? Grazie mille – VAAA

+0

Grazie appena aggiunto quella riga ma ottengo il seguente errore: Il tipo NinjectMVC.NinjectDependencyResolver non sembra implementare Microsoft.Practices.ServiceLocation.IServiceLocator. Qualche indizio? – VAAA

+0

@VAAA vedere la mia risposta aggiornata. – nemesv

0

So che questo è un thread vecchio, ma questo potrebbe essere utile per qualcuno. :) Nel mio caso, mancava il DependencyResolver su NinjectWebCommon.cs. Ho seguito questo article e tutto ha funzionato bene.

RegisterServices(kernel); 
GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel); 
return kernel; 
Problemi correlati