簡體   English   中英

如何在WebApi中使用Ninject?

[英]How to use Ninject with WebApi?

我需要在Web APi應用程序上使用Ninject(我使用空的Web API模板創建了它)。

我安裝了以下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();
    }
}
}

當我重建應用程序時,第一次加載就可以了,我的控制者得到了IDocumentSession 但是當我重新加載同一頁面時,出現了錯誤

“類型..沒有默認構造函數”

這是我在Web API項目中進行設置的方法:

從nuget.org下載常規Ninject

PM> Install-Package Ninject

在您的Web API項目中,在該文件夾中添加名為Infrastructure的新文件夾,創建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());
    }
}

在Application_Start()方法的Global.asax文件中,添加:

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

就是這樣!

這是用法示例:

public class PersonController : ApiController
{
    private readonly IXyzRepository repository;

    public PersonController(IXyzRepository repo)
    {
        repository = repo;

    }
...
...
...

我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM