首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有没有参数的构造函数,包括MVC和Web

问没有没有参数的构造函数,包括MVC和Web
EN

Stack Overflow用户
提问于 2016-01-08 08:10:05
回答 1查看 1K关注 0票数 0

在将此标记为副本之前,请花时间阅读该问题!

我在VS2015中创建了一个新的web应用项目,增加了MVC 5和Web 2。

我在项目中添加了以下软件包:

代码语言:javascript
复制
Ninject
Ninject.MVC5
Ninject.Web
Ninject.Web.Common
Ninject.Web.Common.WebHost
Ninject.Web.WebApi
Ninject.Web.WebApi.WebHost

这在NinjectWeb.cs文件夹中创建了一个App_Start和NinjectWebCommon.cs文件。两者都有断点,我知道它们在启动时就会被击中。

但我还是得到了

没有为该对象定义无参数构造函数。

当击中MVC控制器和

确保控制器具有无参数的公共构造函数。

击中Web控制器时出错。

因此,我有一个“解决”问题的方法,我将这2行代码添加到NinjectWebCommon.cs文件的NinjectWebCommon.cs方法中:

代码语言:javascript
复制
GlobalConfiguration.Configuration.DependencyResolver = new Ninject.Web.WebApi.NinjectDependencyResolver(kernel);
System.Web.Mvc.DependencyResolver.SetResolver(new Ninject.Web.Mvc.NinjectDependencyResolver(kernel));

因此,问题是:在Ninject代码中,应该在哪里处理这个问题?我想从GitHub上抓取代码来彻底解决这个问题,但是想知道我应该在哪里寻找一些提示吗?

编辑:RegisterServices方法的内容:

代码语言:javascript
复制
private static void RegisterServices(IKernel kernel) {

            // Identity
            kernel.Bind<IUserStore<ApplicationUser>>()
                .To<UserStore<ApplicationUser>>()
                .WithConstructorArgument("connectionNameOrUrl", "User.MongoDB");
            kernel.Bind<UserManager<ApplicationUser>>()
                .ToSelf()
                .InRequestScope()
                .WithConstructorArgument("store", ctx => ctx.Kernel.Get<IUserStore<ApplicationUser>>());

            // Services

            // Other
            kernel
                .Bind<IAzureSettings>()
                .To<UserAzureSettings>()
                .InRequestScope();

            // Providers
            kernel
                .Bind<WebApiUserProvider>()
                .ToSelf();
            kernel
                .Bind<MVCUserProvider>()
                .ToSelf();
            kernel
                .Bind<IUserProvider>()
                .ToMethod((ctx) => {
                    if (HttpContext.Current.Handler.GetType().Namespace.StartsWith("System.Web.Mvc")) {
                        return ctx.Kernel.Get<MVCUserProvider>(new Ninject.Parameters.IParameter[] { });
                    }
                    else {
                        return ctx.Kernel.Get<WebApiUserProvider>(new Ninject.Parameters.IParameter[] { });
                    }
                })
                .InRequestScope();
        }
EN

回答 1

Stack Overflow用户

发布于 2016-01-08 11:38:12

我只是做了一些尼尼姆和MVC的实验。我碰巧在我的直播网站上有你在问题中提到的两句话,但直到现在我还没有真正想过为什么需要它们,除了我需要它注入WebAPI之外。

我在Visual中创建了一个全新的ASP.NET MVC项目,安装了Nuget包Ninject.MVC5。我添加了一个简单的接口、具体的实现,并向RegisterServices()类的NinjectWebCommon方法添加了一个绑定。

在将绑定添加到MVC控制器之后,它刚刚工作,接口在构造函数中被解析为具体的类。可以说,尼尼莫的MVC版本可以直接“开箱即用”,而不必显式地分配依赖项注入器。

我查看了用于Ninject.Web.WebApi的Github,主页上有一个示例项目,您可以下载它,其中有三个注入到WebAPI的示例应用程序。解决方案中的示例WebAPI示例(不是OwinHosted或SelfHosted项目)也没有分配DependencyResolver.我在恢复了Nuget包之后运行了它,它可以工作。

我意识到这并不能完全回答这个问题,但我认为仔细看看WebApi项目的例子可能会发现答案。或者是因为ASP.NET MVC和WebAPI存在于同一个项目中,而我们想要注入到这两个项目中呢?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34672259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档