MVC5,Web API 2和Ninject

 liqiqinai 发布于 2023-02-10 12:47

我用Web API 2创建了一个新的MVC5项目,然后我从NuGet添加了Ninject.MVC3包.

构造函数注入适用于MVC5控制器,但在尝试将其与Web API控制器一起使用时出现错误.

尝试创建"UserProfileController"类型的控制器时发生错误.确保控制器具有无参数的公共构造函数.

工作MVC5控制器的构造函数:

public class HomeController : Controller
{
    private IMailService _mail;
    private IRepository _repo;

    public HomeController(IMailService mail, IRepository repo)
    {
        _mail = mail;
        _repo = repo;
    }
}

非工作Web API控制器的构造函数:

public class UserProfileController : ApiController
{
    private IRepository _repo;

    public UserProfileController(IRepository repo)
    {
        _repo = repo;
    }
}

下面是完整的NinjectWebCommon.cs文件:

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

namespace DatingSite.App_Start
{
using System;
using System.Web;

using Microsoft.Web.Infrastructure.DynamicModuleHelper;

using Ninject;
using Ninject.Web.Common;
using DatingSite.Services;
using DatingSite.Data;

public static class NinjectWebCommon
{
    private static readonly Bootstrapper bootstrapper = new Bootstrapper();

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

    /// 
    /// Stops the application.
    /// 
    public static void Stop()
    {
        bootstrapper.ShutDown();
    }

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

        RegisterServices(kernel);
        return kernel;
    }

    /// 
    /// Load your modules or register your services here!
    /// 
    /// The kernel.
    private static void RegisterServices(IKernel kernel)
    {
#if DEBUG
        kernel.Bind().To().InRequestScope();

#else
        kernel.Bind().To().InRequestScope();
#endif
        kernel.Bind().To().InRequestScope();
        kernel.Bind().To().InRequestScope();
    }
}
}

Hari.. 104

Ninject.Web.WebApi NuGet 包刚刚发布.从现在开始,首选解决方案是使用该包.我找不到任何相关的文档,但安装包后一切都适合我.

Install-Package Ninject.Web.WebApi 

安装完成后,Ninject提供了普通的MVC和API控制器实例.

如果你已经安装了Ninject.Web.Common,请确保从NinjectWebCommon.cs保存绑定,让Nuget在安装过程中重写NinjectWebCommon.cs,并在完成时放回绑定.

正如评论中指出的,取决于您的执行上下文,您还需要以下软件包之一:

Ninject.Web.WebApi.WebHost

Ninject.Web.WebApi.OwinHost

Ninject.Web.WebApi.Selfhost

最常见的情况是IIS选择WebHost包.

如果您从头开始创建IIS MVC5 Web应用程序并希望使用Ninject安装以下软件包:

Ninject - Ninject核心dll

Ninject.Web.Common - Ninject的常见Web功能,例如.InRequestScope()

Ninject.MVC5 - MVC依赖注入器,例如.为MVC提供控制器

Ninject.Web.Common.WebHost - 当IIS启动Web应用程序时,从Ninject.MVC5注册依赖注入器.如果您不使用IIS,则需要一个不同的包,请在上面查看

Ninject.Web.WebApi WebApi依赖注入器例如.为WebApi提供控制器

Ninject.web.WebApi.WebHost - 当IIS启动Web应用程序时,从Ninject.Web.WebApi注册依赖注入器.

为了让它与IIS很好地配合,我需要安装Ninject.Web.WebApi.WebHost.这提供了WebActivatorEx和NinjectWebCommon,这似乎是新的WebApi项目所必需的. (50认同)

当我安装软件包时,这并没有提示覆盖任何文件,但是添加Ninject.Web.WebApi和Ninject.Web.WebApi.WebHost解决了我的组合MVC + Web API应用程序中的问题. (3认同)

不要忘记添加`GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);``RegisterServices(kernel);` (3认同)


Artur Movses.. 37

您有这个问题,因为Controller和ApiController使用不同的依赖关系解析器.解决方案非常简单.

首先创建依赖性解析器和依赖性范围的新类.你可以用这个:

 public class NinjectResolver : NinjectScope, IDependencyResolver
{
    private readonly IKernel _kernel;
    public NinjectResolver(IKernel kernel)
        : base(kernel)
    {
        _kernel = kernel;
    }
    public IDependencyScope BeginScope()
    {
        return new NinjectScope(_kernel.BeginBlock());
    }
}

public 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 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;
    }
}


之后,在NinjectWebCommon中向方法CreateKernel()添加下一行

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

我强烈建议使用现在的nuget包.代码与上面的代码有问题 (2认同)


小智.. 29

我有同样的问题.安装以下NuGet包之后:

Ninject

Ninject.web.WebApi

Ninject.web.WebApi.WebHost

Ninject.MVC3

Ninject.web.Common

Ninject.web.Common.WebHost

一切正常

4 个回答
  • Ninject.Web.WebApi NuGet 包刚刚发布.从现在开始,首选解决方案是使用该包.我找不到任何相关的文档,但安装包后一切都适合我.

    Install-Package Ninject.Web.WebApi 
    

    安装完成后,Ninject提供了普通的MVC和API控制器实例.

    如果你已经安装了Ninject.Web.Common,请确保从NinjectWebCommon.cs保存绑定,让Nuget在安装过程中重写NinjectWebCommon.cs,并在完成时放回绑定.

    正如评论中指出的,取决于您的执行上下文,您还需要以下软件包之一:

    Ninject.Web.WebApi.WebHost

    Ninject.Web.WebApi.OwinHost

    Ninject.Web.WebApi.Selfhost

    最常见的情况是IIS选择WebHost包.

    如果您从头开始创建IIS MVC5 Web应用程序并希望使用Ninject安装以下软件包:

    Ninject - Ninject核心dll

    Ninject.Web.Common - Ninject的常见Web功能,例如.InRequestScope()

    Ninject.MVC5 - MVC依赖注入器,例如.为MVC提供控制器

    Ninject.Web.Common.WebHost - 当IIS启动Web应用程序时,从Ninject.MVC5注册依赖注入器.如果您不使用IIS,则需要一个不同的包,请在上面查看

    Ninject.Web.WebApi WebApi依赖注入器例如.为WebApi提供控制器

    Ninject.web.WebApi.WebHost - 当IIS启动Web应用程序时,从Ninject.Web.WebApi注册依赖注入器.

    2023-02-10 12:48 回答
  • 我有同样的问题.安装以下NuGet包之后:

    Ninject

    Ninject.web.WebApi

    Ninject.web.WebApi.WebHost

    Ninject.MVC3

    Ninject.web.Common

    Ninject.web.Common.WebHost

    一切正常

    2023-02-10 12:48 回答
  • 我发现程序集Ninject.Web.WebApi.dll定义了自己的DependencyResolver并自动在类Ninject.Web.WebApi.WebApiModule中将其注册到内核.

    所以我只需添加到NinjectWebCommon.CreateKernel一行......

    GlobalConfiguration.Configuration.DependencyResolver = 
        kernel.Get<System.Web.Http.Dependencies.IDependencyResolver>();
    

    最后我的项目有以下依赖项:

    Ninject 3.2.0

    Ninject.Web.Common 3.2.0

    Ninject.Web.WebApi 3.2.4

    2023-02-10 12:48 回答
  • 您有这个问题,因为Controller和ApiController使用不同的依赖关系解析器.解决方案非常简单.

    首先创建依赖性解析器和依赖性范围的新类.你可以用这个:

     public class NinjectResolver : NinjectScope, IDependencyResolver
    {
        private readonly IKernel _kernel;
        public NinjectResolver(IKernel kernel)
            : base(kernel)
        {
            _kernel = kernel;
        }
        public IDependencyScope BeginScope()
        {
            return new NinjectScope(_kernel.BeginBlock());
        }
    }
    
    public 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;
        }
    }
    

    之后,在NinjectWebCommon中向方法CreateKernel()添加下一行

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

    2023-02-10 12:49 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有