2014-04-29 17 views
11

Tôi biết có một số câu hỏi giống như câu hỏi này nhưng tôi không thể tìm bất kỳ tài liệu nào và không có câu hỏi nào khác có bất kỳ câu trả lời nào giúp tôi, tại đây:Bắt Ninject mới nhất làm việc với MVC 5/Web Api 2 mới nhất?

Tôi tạo ASP mới. NET ứng dụng (VS2013), MVC được chọn, tôi thêm API. Tôi chạy "update-package" trong Package Console để cập nhật lên phiên bản mới nhất (MVC 5.1.2, Web Api 5.1.2).

Sau đó, tôi thêm các gói Ninject.MVC5Ninject.Web.WebApi mới.

tôi thêm những dòng này vào file web.config (Ninject muốn phiên bản 5.0, tôi có 5.1):

 <dependentAssembly> 
      <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" /> 
      <bindingRedirect oldVersion="1.0.0.0-5.1.0.0" newVersion="5.1.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
      <assemblyIdentity name="System.Web.Http.WebHost" publicKeyToken="31bf3856ad364e35" /> 
      <bindingRedirect oldVersion="1.0.0.0-5.1.0.0" newVersion="5.1.0.0" /> 
     </dependentAssembly> 

Trong App_start/NinjectWebCommon.cs nộp tôi thêm một đơn ràng buộc:

private static void RegisterServices(IKernel kernel) { 
     kernel.Bind<ILogger, NLogLogger>(); 
    } 

Sau đó, tôi thêm một ApiController duy nhất, với ILogger là tham số duy nhất trong hàm tạo và tôi thêm ILogger làm tham số cho hàm tạo của HomeController.

Đó có phải là thử nghiệm không?

Tôi có thiếu một số hệ thống dây điện cho WebApi không? Hay điều đó xảy ra "đằng sau hậu trường"?

Dù sao, acessing bộ điều khiển api mang lại cho tôi lỗi này:

An error occurred when trying to create a controller of type 'TestController'. Make sure that the controller has a parameterless public constructor.

Và cố gắng các HomeController mang lại cho tôi điều này:

Object reference not set to an instance of an object.

tôi đã cố gắng điều tương tự, mà không cần cập nhật các gói mới nhất , cùng một vấn đề. Tôi đã sử dụng Ninject trong nhiều năm với MVC 3 (Tôi cũng đã thử các gói Ninject.MVC3), và hoàn toàn không biết gì về lý do tại sao mà không hoạt động. Với WebApi, tôi đã chờ đợi một số cuộc gọi đến SetResolver, nhưng ..

Bất kỳ trợ giúp nào sẽ được đánh giá cao!

Trả lời

10

Đây không phải là một MVC/WebApi issue

cấu hình của bạn sai:

kernel.Bind<ILogger, NLogLogger>(); 
.210

nên

kernel.Bind<ILogger>().To<NLogLogger>(); 
+0

Đó là những gì sẽ xảy ra khi bạn làm việc với Ninject trong nhiều năm, nhưng với sự trừu tượng ở giữa! Cảm ơn bạn rất nhiều! Chỉ cần để làm rõ, những gì bạn có nghĩa là với "Đăng ký ILogger một lần cho cả hai" là tôi đăng ký nó một lần, và sau đó nó hoạt động cho cả MVC và WebApi? Ít nhất là những gì dường như đã xảy ra. –

+1

@Remo Gloor: câu trả lời của bạn có lỗi cú pháp. Vui lòng thêm '()' sau 'kernel.Bind '. Vì vậy, mã trả lời đầy đủ sẽ là: 'kernel.Bind () .To ();'. Tôi mệt mỏi cải thiện câu trả lời này, nhưng dường như các Review guys đã không tìm thấy bất kỳ điều hữu ích trong việc sửa lỗi cú pháp !!! –

13

Như được đề cập bởi documentation Ninject.Web.WebApi không phải là gói Nuget độc lập. Chọn gói Ninject.Web.WebApi. * Thích hợp cho ứng dụng của bạn. Nhiều khả năng nó sẽ do Ninject.Web.WebApi.WebHost trong trường hợp của bạn.

  1. Tạo ứng dụng Web trống
  2. Install Ninject.MVC5
  3. Install Ninject.Web.WebApi.WebHost
  4. Cập nhật tất cả NuGet gói
  5. Tạo Controller MVC và ApiController mà phải mất một sự phụ thuộc ILogger
  6. Đăng ký ILogger một lần cho cả MVC và WebAPI
  7. Run
+0

Cảm ơn bạn đã liên kết, không biết lý do tại sao Google không thấy. Tôi đã làm như bạn đã viết (và thêm các công cụ vào tập tin web.config như tôi đã viết trong câu hỏi, nó không phải là làm việc mà không có), vẫn nhận được các lỗi tương tự. Khi bạn viết Đăng ký ILogger một lần cho BOTH, điều đó có nghĩa là gì? Tôi không tìm thấy bất cứ điều gì về hệ thống dây điện phần WebApi vẫn còn. (Dự án cơ sở của tôi là ở đây: https://bitbucket.org/steentottrup/mvc5webapi2ninjecttest) –

+0

Cảm ơn Remo, câu trả lời này là thẳng về phía trước và làm việc cho tôi trong khi tôi đã thử rất nhiều câu trả lời trên google. Chỉ để tham khảo, cho dự án của tôi, tôi đang sử dụng MVC5 & Web Api. – Alex

3

Để sử dụng Ninject trong một dự án với MVCWebApi bạn phải cài đặt các gói sau:

-Ninject 
-Ninject.MVC5 
-Ninject.Web 
-Ninject.Web.Common 
-Ninject.Web.Common.WebHost 
-Ninject.Web.WebApi 
-Ninject.Web.WebApi.WebHost 

Những gói thêm các tập tin sau đây để App_Start thư mục:
NinjectWeb.cs:

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(Smartiz.UI.NinjectWeb), "Start")] 

namespace Smartiz.UI 
{ 
    using Microsoft.Web.Infrastructure.DynamicModuleHelper; 

    using Ninject.Web; 

    public static class NinjectWeb 
    { 
     /// <summary> 
     /// Starts the application 
     /// </summary> 
     public static void Start() 
     { 
      DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
     } 
    } 
} 

NinjectWebCommon.cs:

using System; 
using System.Web; 
using Microsoft.Web.Infrastructure.DynamicModuleHelper; 
using Ninject; 
using Ninject.Extensions.Conventions; 
using Ninject.Web.Common; 
using Smartiz.ClientServices; 
using Smartiz.UI; 
using WebActivatorEx; 

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(NinjectWebCommon), "Start")] 
[assembly: ApplicationShutdownMethod(typeof(NinjectWebCommon), "Stop")] 

namespace Smartiz.UI 
{ 
    public static class NinjectWebCommon 
    { 
     private static readonly Bootstrapper Bootstrapper = new Bootstrapper(); 

     /// <summary> 
     /// Starts the application 
     /// </summary> 
     public static void Start() 
     { 
      DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
      DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
      Bootstrapper.Initialize(CreateKernel); 
     } 

     /// <summary> 
     /// Stops the application. 
     /// </summary> 
     public static void Stop() 
     { 
      Bootstrapper.ShutDown(); 
     } 

     /// <summary> 
     /// Creates the kernel that will manage your application. 
     /// </summary> 
     /// <returns>The created kernel.</returns> 
     private static IKernel CreateKernel() 
     { 
      var kernel = new StandardKernel(); 
      try 
      { 
       kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
       kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

       RegisterServices(kernel); 
       return kernel; 
      } 
      catch 
      { 
       kernel.Dispose(); 
       throw; 
      } 
     } 

     /// <summary> 
     /// Load your modules or register your services here! 
     /// </summary> 
     /// <param name="kernel">The kernel.</param> 
     private static void RegisterServices(IKernel kernel) 
     { 
      //kernel.Bind(q => 
      // q.FromAssembliesMatching("Smartiz.ClientServices*") 
      // .SelectAllClasses() 
      // .InheritedFrom(typeof(BaseService)) 
      // .BindDefaultInterface() 
      // .Configure(c => c.InSingletonScope())); 
     }   
    } 
} 
+0

Điều này sẽ không hoạt động đối với WebApi. –

+0

Tại sao lại thêm dòng này hai lần? DynamicModuleUtility.RegisterModule (typeof (NinjectHttpModule)); – usefulBee

Các vấn đề liên quan