ASP.NET MVC的WebAPI:此对象定义无参数的构造函数 [英] ASP.NET MVC WebApi: No parameterless constructor defined for this object
问题描述
我有我想要实现工作模式的单位一个ASP.NET MVC 4应用程序。
I have an ASP.NET MVC 4 Application that I want to implement Unit of Work Pattern.
在我的Web项目我有:
In my Web Project I have:
IocConfig.cs
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中
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
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);
}
}
}
当我尝试冲浪: http://www.domain.com/Persons/Get即时得到:
When I try to surf: http://www.domain.com/Persons/Get Im getting:
此对象定义无参数的构造函数。
有我错过任何东西吗?我想AP preciate任何帮助。
Is there any stuff I have missed? I would appreciate any help.
下面是该项目的更好的参考zip文件:
Here is the zip file of the project for better references:
http://filebin.ca/E6aoOkaUpbQ/NinjectMVC.zip
推荐答案
Wep.API使用不同的的IDependencyResolver
比MVC框架。
Wep.API uses a different IDependencyResolver
than the MVC framework.
当您使用 HttpConfiguration.DependencyResolver
它仅适用于ApiControllers。但是,你的 ApiControllerBase
从控制器导出
...
When you use theHttpConfiguration.DependencyResolver
it only works for ApiControllers. But your ApiControllerBase
derives from Controller
...
所以你的 ApiControllerBase
应 ApiController
继承。
更改它在你的ApiBaseController.cs:
Change it in your ApiBaseController.cs:
public abstract class ApiControllerBase : ApiController
{
}
如果你想注入依赖于你需要使用(在你的IocConfig)常规控制器
派生类:
If you want to inject dependencies to regular Controller
derived classes you need to use ( in your IocConfig):
System.Web.Mvc.DependencyResolver.SetResolver(new NinjectMvcDependencyResolver(container));
请注意,在这种情况下,你不能使用你的 NinjectDependencyResolver
,因为它是 ApiControllers
。
Note that in this case you cannot use your NinjectDependencyResolver
because it's for ApiControllers
.
所以你需要一个不同的 NinjectMvcDependencyResolver
应实施 System.Web.Mvc.IDependencyResolver
。
So you need a different NinjectMvcDependencyResolver
which should implement System.Web.Mvc.IDependencyResolver
.
public class NinjectMvcDependencyResolver: NinjectDependencyScope,
System.Web.Mvc.IDependencyResolver
{
private IKernel kernel;
public NinjectDependencyResolver(IKernel kernel)
: base(kernel)
{
this.kernel = kernel;
}
}
这篇关于ASP.NET MVC的WebAPI:此对象定义无参数的构造函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!