2015-08-13 2 views
0

Я борюсь с включением инжектора конструктора Ninject в приложении веб-службы. Вот шаги, которые я предпринял (Visual Studio 2013):Ninject не разрешает зависимость (ошибка конструктора без параметров)

1) Создал новый проект с шаблоном «ASP.NET Web Application».

2) Выбрал шаблон «Пустой» приложения на втором этапе мастера создания проекта.

3) На третьем этапе под названием «Добавление папок и основные ссылки на» выбран «Web API»

4) Проект создан, теперь я добавил контроллер типа «Web API 2 Controller - Пустой» , Добавлен следующий код:

using System.Web.Http; 

namespace WebApplication1.Controllers 
{ 
    public interface IDummy 
    { 
    } 

    public class Dummy : IDummy 
    { 
    } 

    public class DefaultController : ApiController 
    { 
     public DefaultController(IDummy dummy) 
     { 
     } 

     [HttpGet] 
     [Route("")] 
     public string Index() 
     { 
      return "Hello World!"; 
     } 
    } 
} 

5) Установленное NuGet пакет: Ninject.Web.WebApi (Ninject интеграция WebApi2), теперь я нашел в других потоках, которые, чтобы сделать его работу с IIS мне нужно установить Ninject .Web.Common.WebHost. После этого в AppStart появился файл NinjectWebCommon.cs. Единственное изменение я сделал для этого файла был в методе RegisterServices:

private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<IDummy>().To<Dummy>(); 
} 

Теперь, когда я пытаюсь запустить приложение (локально, просто нажав клавишу F5 в Visual Studio), я бы ожидать, чтобы получить строку Hello World в браузере , но вместо этого я получаю печально известную ошибку конструктора без параметров: Error , что означает, что Ninject почему-то не выполняет свою работу, я думаю. К сожалению, googling для решения до сих пор был бесплодным. Кто-нибудь может намекнуть мне, что мне делать, чтобы сделать эту работу? Заранее спасибо.

+0

ли вы 'WebActivatorEx' установлен? –

+0

Yup, пакет Ninject.Web.Common.WebHost зависит от него. – Caleb9

+0

У вас установлен https://www.nuget.org/packages/Ninject.MVC3/? Думайте, что вам это нужно, так что Ninject знает, как подключить контроллеры. – PeteG

ответ

0

Мне удалось получить эту работу достаточно просто, используя this solution. Вам нужно только установить Ninject.Web.WebApi, а затем добавить следующий код.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web.Http.Dependencies; 
using Ninject; 
using Ninject.Activation; 
using Ninject.Parameters; 
using Ninject.Syntax; 

internal class NinjectDependencyResolver : NinjectScope, IDependencyResolver 
{ 
    private readonly IKernel kernel; 

    public NinjectDependencyResolver(IKernel kernel) 
     : base(kernel) 
    { 
     if (kernel == null) 
      throw new ArgumentNullException("kernel"); 

     this.kernel = kernel; 
    } 

    public IDependencyScope BeginScope() 
    { 
     return new NinjectScope(this.kernel.BeginBlock()); 
    } 
} 

internal class NinjectScope : IDependencyScope 
{ 
    protected IResolutionRoot resolutionRoot; 
    public NinjectScope(IResolutionRoot kernel) 
    { 
     resolutionRoot = kernel; 
    } 
    public object GetService(Type serviceType) 
    { 
     IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true); 
     return resolutionRoot.Resolve(request).SingleOrDefault(); 
    } 
    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true); 
     return resolutionRoot.Resolve(request).ToList(); 
    } 
    public void Dispose() 
    { 
     IDisposable disposable = (IDisposable)resolutionRoot; 
     if (disposable != null) disposable.Dispose(); 
     resolutionRoot = null; 
    } 
} 

Использование

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     IKernel kernel = new StandardKernel(); 

     kernel.Bind<IDummy>().To<Dummy>(); 

     config.DependencyResolver = new NinjectDependencyResolver(kernel); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 
+0

Работы, также как вы указали, но я подчеркну, что теперь мне не нужен пакет Ninject.Web.Common.WebHost :). Благодарю. – Caleb9

+0

Благодарим вас за пошаговые инструкции по настройке сценария. Он ответил на ваш вопрос ветерок. – NightOwl888

Смежные вопросы