2012-08-31 37 views
8

Tengo una aplicación ASP.NET MVC 4 que deseo implementar Patrón de unidad de trabajo.ASP.NET MVC WebApi: Ningún constructor sin parámetros definido para este objeto

En mi proyecto web que tengo:

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

    } 
} 

Cuando trato de navegar : http://www.domain.com/Persons/Get obtengo:

No se ha definido ningún constructor sin parámetros para este objeto.

¿Hay algo que me haya perdido? Apreciaría cualquier ayuda.

Aquí está el archivo zip del proyecto de mejores referencias:

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

Respuesta

8

Wep.API utiliza una diferente IDependencyResolver que el framework MVC.

Cuando utiliza el HttpConfiguration.DependencyResolver, solo funciona para ApiControllers. Pero su ApiControllerBase deriva de Controller ...

Por lo tanto, su ApiControllerBase debe heredar de ApiController.

cambio en sus ApiBaseController.cs:

public abstract class ApiControllerBase : ApiController 
{ 
} 

Si desea inyectar dependencias a Controller clases regulares derivados que necesita para utilizar (en su IocConfig):

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

en cuenta que en en este caso no puede usar su NinjectDependencyResolver porque es para ApiControllers.

Necesita un NinjectMvcDependencyResolver diferente que debe implementar 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

Gracias, en realidad quiero usarlos para el controlador normal. ¿Sabes qué debería usar en lugar de HttpConfiguration.DependencyResolver? Muchas gracias – VAAA

+0

Gracias acaba de agregar esa línea, pero me aparece el siguiente error: El tipo NinjectMVC.NinjectDependencyResolver no parece implementar Microsoft.Practices.ServiceLocation.IServiceLocator. ¿Cualquier pista? – VAAA

+0

@VAAA ver mi respuesta actualizada. – nemesv

0

Sé que este es un hilo viejo, pero podría ser útil para alguien. :) En mi caso, faltaba el DependencyResolver en NinjectWebCommon.cs. Seguí este article y todo funcionó bien.

RegisterServices(kernel); 
GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel); 
return kernel; 
Cuestiones relacionadas