Asp.net-Mvc
ASP.NET MVC WebApi:沒有為此對象定義無參數建構子
我有一個想要實現工作單元模式的 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 文件,以便更好地參考:
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; } }