【问题标题】:How do i set up dependencies using ninject with WebAPI [duplicate]如何使用带有 WebAPI 的 ninject 设置依赖项 [重复]
【发布时间】:2014-09-22 22:40:52
【问题描述】:

我已经使用 Nuget 安装了 Ninject.Web.WebAPI 包,但我不知道如何绑定我的依赖项。

我经常在我的 MVC 应用程序中使用 Ninject,当我安装 Ninject 包时,它会创建一个 NinjectWebCommon.cs 文件,我在其中设置我的绑定。此文件似乎不会为 WebAPI 项目生成。

任何人都可以帮助我确定将绑定放在哪里。

干杯

【问题讨论】:

    标签: c# asp.net-mvc asp.net-web-api ninject


    【解决方案1】:

    创建一个类来修复 web api 的 NinjectDependencyResolver 问题。

    public class NinjectDependencyResolverHelper : IDependencyScope
        {
            IResolutionRoot resolver;
            public NinjectDependencyResolverHelper(IResolutionRoot resolver)
            {
                this.resolver = resolver;
            }
            public object GetService(Type serviceType)
            {
                if (resolver == null)
                    throw new ObjectDisposedException("this", "This scope has been disposed");
                return resolver.TryGet(serviceType);
            }
            public System.Collections.Generic.IEnumerable<object> GetServices(Type serviceType)
            {
                if (resolver == null)
                    throw new ObjectDisposedException("this", "This scope has been disposed");
                return resolver.GetAll(serviceType);
            }
            public void Dispose()
            {
                var disposable = resolver as IDisposable;
                if (disposable != null)
                    disposable.Dispose();
                resolver = null;
            }
        }
        public class NinjectDependencyResolver : NinjectDependencyResolverHelper, IDependencyResolver
        {
            IKernel kernel;
            public NinjectDependencyResolver(IKernel kernel)
                : base(kernel)
            {
                this.kernel = kernel;
            }
            public IDependencyScope BeginScope()
            {
                return new NinjectDependencyResolverHelper(kernel.BeginBlock());
            }
        }
    

    然后创建 NinjectWebCommon 类

    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>();
    
            GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
    
            RegisterServices(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)
        {
            //Bind your stuff            
        }        
    }
    

    希望这会有所帮助。

    【讨论】:

    • 实际上,Ninject.Web.WebApi 的最新版本(“Ninject Integration for WebApi 2”,至少是 3.2.1.0 版)不需要任何自定义。只需添加包并在 NinjectWebCommon.cs 中正常注册所有内容。
    猜你喜欢
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 2023-03-03
    • 2011-04-06
    相关资源
    最近更新 更多