Asp.net-Mvc

ASP.NET MVC WebApi:沒有為此對象定義無參數建構子

  • February 12, 2018

我有一個想要實現工作單元模式的 ASP.NET MVC 4 應用程序。

在我的 Web 項目中,我有:

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

全球.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();
       }
   }
}

人員控制器.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);
       }

   }
}

當我嘗試上網時:http: //www.domain.com/Persons/Get我得到:

沒有為此對象定義無參數建構子。

有什麼我錯過的嗎?我將不勝感激任何幫助。

這是項目的 zip 文件,以便更好地參考:

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

Wep.API 使用不同於IDependencyResolverMVC 的框架。

當您使用它時,HttpConfiguration.DependencyResolver它僅適用於 ApiControllers。但你的ApiControllerBase派生自Controller

所以你ApiControllerBase應該繼承自ApiController.

在您的 ApiBaseController.cs 中更改它:

public abstract class ApiControllerBase : ApiController
{
}

如果您想將依賴項注入到Controller您需要使用的正常派生類中(在您的 IocConfig 中):

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

請注意,在這種情況下,您不能使用 your NinjectDependencyResolver,因為它用於ApiControllers.

所以你需要一個不同NinjectMvcDependencyResolver的應該實現 的System.Web.Mvc.IDependencyResolver

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

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

引用自:https://stackoverflow.com/questions/12217636