2012-08-31 19 views
8

Tôi có một ứng dụng ASP.NET MVC 4 mà tôi muốn triển khai Mẫu đơn vị công việc.ASP.NET MVC WebApi: Không có hàm tạo tham số nào được định nghĩa cho đối tượng này

Trong dự án Web của tôi, tôi có:

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

    } 
} 

Khi tôi cố gắng lướt : http://www.domain.com/Persons/Get Im nhận:

Không có hàm tạo tham số nào được xác định cho đối tượng này.

Có nội dung nào tôi đã bỏ lỡ không? Tôi sẽ đánh giá cao sự giúp đỡ nào.

Dưới đây là file zip của dự án để tham khảo tốt hơn:

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

Trả lời

8

Wep.API sử dụng một IDependencyResolver khác so với khung MVC.

Khi bạn sử dụng HttpConfiguration.DependencyResolver, nó chỉ hoạt động đối với ApiControllers. Nhưng số ApiControllerBase của bạn có nguồn gốc từ Controller ...

Vì vậy, ApiControllerBase của bạn nên được kế thừa từ ApiController.

Thay đổi nó trong ApiBaseController.cs của bạn:

public abstract class ApiControllerBase : ApiController 
{ 
} 

Nếu bạn muốn tiêm phụ thuộc để thường xuyên Controller các lớp thừa kế bạn cần phải sử dụng (trong IocConfig của bạn):

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

Lưu ý rằng trong trường hợp này bạn không thể sử dụng NinjectDependencyResolver vì nó dành cho ApiControllers.

Vì vậy, bạn cần NinjectMvcDependencyResolver khác nhau nên triển khai 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

Cảm ơn, thực sự tôi muốn sử dụng chúng cho Bộ điều khiển thông thường. Bạn có biết những gì tôi nên sử dụng thay vì HttpConfiguration.DependencyResolver? Cảm ơn rất nhiều – VAAA

+0

Cảm ơn vừa thêm dòng đó nhưng tôi nhận được lỗi sau: Loại NinjectMVC.NinjectDependencyResolver không xuất hiện để triển khai Microsoft.Practices.ServiceLocation.IServiceLocator. Bất kỳ đầu mối? – VAAA

+0

@VAAA xem câu trả lời cập nhật của tôi. – nemesv

0

Tôi biết đây là một chủ đề cũ, nhưng điều này có thể hữu ích cho ai đó. :) Trong trường hợp của tôi, thiếu số DependencyResolver trên NinjectWebCommon.cs. Tôi đã theo dõi article này và mọi thứ hoạt động tốt.

RegisterServices(kernel); 
GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel); 
return kernel; 
Các vấn đề liên quan