ASP.NET MVC的WebAPI:此对象定义无参数的构造函数 [英] ASP.NET MVC WebApi: No parameterless constructor defined for this object

查看:274
本文介绍了ASP.NET MVC的WebAPI:此对象定义无参数的构造函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有我想要实现工作模式的单位一个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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆