2013-03-18 3 views
2

Мне нужно использовать Ninject в веб-приложении APi (я создал его с помощью пустого веб-шаблона api).Как использовать Ninject с WebApi?

Я установил следующий NuGet пакет:

Ninject.Web.WebApi 

Ninject.MVC3 

Вот мой application_start

protected void Application_Start() 
    { 

     AreaRegistration.RegisterAllAreas(); 

     WebApiConfig.Register(GlobalConfiguration.Configuration); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 


    } 

Мои Ninject.Web.Common

[assembly: WebActivator.PreApplicationStartMethod(typeof(rb.rpg.backend.App_Start.NinjectWebCommon), "Start")] 
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(rb.rpg.backend.App_Start.NinjectWebCommon), "Stop")] 

namespace rb.rpg.backend.App_Start 
{ 
    using System; 
    using System.Web; 

using Microsoft.Web.Infrastructure.DynamicModuleHelper; 

using Ninject; 
using Ninject.Web.Common; 
using Raven.Client; 
using RemiDDD.Framework.Cqrs;  
using System.Web.Http.Dependencies; 
using System.Web.Http; 
using System.Collections.Generic; 
using Ninject.Web.WebApi; 

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(); 
     kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
     kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

     RegisterServices(kernel); 
     //System.Web.Mvc.DependencyResolver.SetResolver(new LocalNinjectDependencyResolver(kernel)); 
     GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel); 
     return kernel; 
    } 

    /// <summary> 
    /// Load your modules or register your services here! 
    /// </summary> 
    /// <param name="kernel">The kernel.</param> 
    private static void RegisterServices(IKernel kernel) 
    { 

     kernel.Bind<IDocumentSession>() 
      .ToMethod(ctx => WebApiApplication.DocumentStore.OpenSession()) 
      .InRequestScope(); 
     kernel.Bind<MessageProcessor>() 
      .ToMethod(ctx => 
      { 
       var MessageProcessor = new MessageProcessor(kernel); 

       /*...*/ 
       return MessageProcessor; 
      }) 
      .InSingletonScope(); 
    } 
} 
} 

Когда я перестраивать приложение первой загрузки это хорошо, мой contrller получает мой IDocumentSession. Но когда я перезарядить ту же страницу, я получил errror

«тип .. не имеет конструктор не по умолчанию»

+0

Я могу только предположить, что проблема может заключаться в вызове 'WebApiApplication.DocumentStore.OpenSession()' за запрос. Что делает этот метод? Что такое «DocumentStore»? – mipe34

+0

DocumentStore - это ссылка на RavenDb. Сессия - это месть. Я взял этот код из блога создателя. Он отлично работает в других проектах –

ответ

1

Вот как я поставил его в своих Web API проектов:

Скачать регулярные Ninject из nuget.org

PM> Install-Package Ninject 

в вашем проекте Web API добавить новую папку с именем инфраструктуры в этой папке создать 2 файла:

NInjectDependencyScope.cs с содержанием:

public class NInjectDependencyScope : IDependencyScope 
{ 
    private IResolutionRoot _resolutionRoot; 

    public NInjectDependencyScope(IResolutionRoot resolutionRoot) 
    { 
     _resolutionRoot = resolutionRoot; 
    } 

    public void Dispose() 
    { 
     var disposable = _resolutionRoot as IDisposable; 

     if (disposable != null) 
      disposable.Dispose(); 

     _resolutionRoot = null; 
    } 

    public object GetService(Type serviceType) 
    { 
     return GetServices(serviceType).FirstOrDefault(); 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     var request = _resolutionRoot.CreateRequest(serviceType, null, new IParameter[0], true, true); 

     return _resolutionRoot.Resolve(request); 
    } 
} 

и NInjectDependencyResolver.cs с содержанием:

public class NInjectDependencyResolver : NInjectDependencyScope, IDependencyResolver 
{ 
    private IKernel _kernel; 

    public NInjectDependencyResolver(IKernel kernel) : base(kernel) 
    { 
     _kernel = kernel; 
    } 

    public IDependencyScope BeginScope() 
    { 
     return new NInjectDependencyScope(_kernel.BeginBlock()); 
    } 
} 

В Global.asax файл в Application_Start() метод дополнения:

//Ninject dependency injection configuration 
     var kernel = new StandardKernel(); 
     kernel.Bind<IXyzRepository>().To<EFXyzRepository>(); 

     GlobalConfiguration.Configuration.DependencyResolver = new NInjectDependencyResolver(kernel); 

так что ваш окончательный Global.asax файл будет выглядеть следующим образом:

public class XyzApiApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     GlobalConfiguration.Configure(WebApiConfig.Register); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 

     //Ninject dependency injection configuration 
     var kernel = new StandardKernel(); 
     //Your dependency bindings 
     kernel.Bind<IXyzRepository>().To<EFXyzRepository>();    

     GlobalConfiguration.Configuration.DependencyResolver = new NInjectDependencyResolver(kernel); 
    } 
} 

An, что это!

Вот пример использования:

public class PersonController : ApiController 
{ 
    private readonly IXyzRepository repository; 

    public PersonController(IXyzRepository repo) 
    { 
     repository = repo; 

    } 
... 
... 
... 

Я надеюсь, что это помогает.

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