MVC5 和 Ninject 的依赖注入失败

2023-12-19

我试图在控制器中注入几个类,但失败了。

这就是我所做的:

  1. Added Ninject.Web.WebApi.WebHost and WebActivatorExNuGet 包
  2. 在下面创建了以下类App_Start:

NinjectWebCommon.cs

using Microsoft.Web.Infrastructure.DynamicModuleHelper;
using Ninject;
using Ninject.Web.Common;
using Ninject.Web.Common.WebHost;
using MyProject;
using MyProject.Models;
using MyProject.Classes;
using System;
using System.Web;

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(NinjectWebCommon), "Start")]
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(NinjectWebCommon), "Stop")]

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

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

        public static void Stop()
        {
            bootstrapper.ShutDown();
        }

        private static IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
            kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

            RegisterServices(kernel);
            return kernel;
        }

        private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind<IMyContext>().ToSelf().InRequestScope();
            kernel.Bind<IErp>().ToSelf().InRequestScope();
        }
    }
}
  1. 创建了我的课程:

MyContext.cs:

using MyProject.Models;
using System;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Threading.Tasks;

namespace MyProject.Models
{
    public interface IMyContext : IDisposable
    {
        DbSet<Operator> Operators { get; set; }
        Task<int> SaveChangesAsync();
    }

    public class MyContext : DbContext, IMyContext
    {
        public MyContext () : base("MyContext ") { }
        public DbSet<Operator> Operators { get; set; }
        public async override Task<int> SaveChangesAsync()
        {
            return await SaveChangesAsync(CancellationToken.None);
        }
    }
}

Erp.cs

public interface IErp
{
    Task ImportListAsync();
}

public class Erp : IErp
{
    private readonly IMyContext _context;
    public Erp(IMyContext context)
    {
        _context = context;
    }

    public async Task ImportListAsync()
    {
        // do something
    }
}
  1. 创建了一个控制器

    using MyProject.Classes;
    using MyProject.Models;
    using System.Data.Entity;
    using System.Threading.Tasks;
    using System.Web.Mvc;
    
    namespace MyProject.Controllers
    {
        public class OperatorsController : Controller
        {
            private readonly IMyContext _context;
            private readonly IErp _erp;
    
            public OperatorsController(IMyContext context, Erp Ierp)
            {
                _context = context;
                _erp = erp;
            }
    
            // GET: Operators
            public async Task<ActionResult> Index()
            {
                return View(await _context.Operators.ToListAsync());
            }
    
            // GET: Operators/Import
            public async Task<ActionResult> Import()
            {
                await _erp.ImportListAsync();
                return View("Index", await _context.Operators.ToListAsync());
            }
        }
    }
    

但是当我运行该应用程序时,我仍然收到有关缺少无参数构造函数的臭名昭著的错误。这对我来说 DI 不起作用。


我相信您的注册电话RegisterServices是错误的 - 你不能绑定接口.ToSelf()- 您需要将接口绑定到具体类实现它 - 像这样:

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IMyContext>().To<MyContext>().InRequestScope();
    kernel.Bind<IErp>().To<Erp>().InRequestScope();
}

这样,您就可以告诉 DI 容器实例化一个MyContext每当你的代码中你期望一个类IMyContext依赖性

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVC5 和 Ninject 的依赖注入失败 的相关文章

随机推荐

  • 动态宽度 DIV 位于静态宽度 DIV 旁边

    一切都在标题中 我试图将页面左侧的 div 设置为静态宽度 170px 这很好用 我遇到的问题是在它旁边添加一个 div 它会缩放以适应剩余的宽度 我可以在这里使用一个简单的方法吗 在右侧 div 上 只需设置边距 style margin
  • 在段落定界符非标准的段落上拆分文本

    如果我的文本具有标准段落格式 空行后跟缩进 例如文本 1 则可以很容易地使用 text split n n 提取段落 Text 1 Lorem ipsum dolor sit amet consectetur adipiscing elit
  • Android - 活动与视图

    我正在开发一个 Android 应用程序 该应用程序有多个屏幕 用户需要在多个屏幕之间导航 我很好奇在这些屏幕之间切换时的最佳实践是什么 我在为每个屏幕创建一个新的 Activity 和简单地更改视图 setContentView R la
  • ruby、sinatra 和 haml 中的联系表

    我对这三个方面都是新手 我正在尝试为网站编写一个简单的联系表格 我想出的代码如下 但我知道它存在一些基本问题 由于我对 sinatra 缺乏经验 任何帮助完成这项工作的帮助将不胜感激 我似乎无法弄清楚 找到这类事情的文档 联系页面的 ham
  • //! [0] Qt源代码中

    的含义是什么 n n 0 1 2 Qt 示例项目中 C QML 源代码中的标记 例如 0 GLWidget GLWidget Helper helper QWidget parent QGLWidget QGLFormat QGL Samp
  • GrabCut 算法的 OpenCV Python 绑定

    我一直在尝试通过 Python 绑定使用 OpenCV 实现抓取剪切方法 我尝试过在 cv 和 cv2 中使用该版本 但我无法找到正确的参数来使该方法正确运行 我尝试了几种参数排列 但似乎没有任何效果 基本上是我在 Github 上看到的每
  • 我可以从 R 中访问 Mac Numbers (.num) 文档吗?

    我知道我可以使用 RODBC 库从 Windows 中访问 excel xls 文档 但是 iWorks 附带的 Numbers 程序是否有类似的功能 如果没有 还有哪些其他解决方案可以轻松编辑电子表格 如查找表 并在 R 中访问它 我知道
  • 如何用Java发现文件的创建时间?

    有没有一种简单的方法可以用Java发现文件的创建时间 File 类只有一个方法来获取 最后修改 时间 根据我在 Google 上找到的一些资源 File 类不提供 getCreationTime 方法 因为并非所有文件系统都支持创建时间的概
  • wp_kses_post 函数中允许使用哪些 HTML?

    我需要清理 admin notices 的输出 它使用某些东西 例如 a id href title strong 使用是个好主意吗wp kses post功能 阅读文档我不确定允许哪些 HTML 标签https developer wor
  • 将 XML 字符串转换为对象

    我正在通过套接字接收 XML 字符串 并希望将它们转换为 C 对象 消息的形式如下
  • 让 Python 的 `assert` 抛出一个我选择的异常

    我可以做吗assert抛出一个我选择的异常AssertionError UPDATE 我将解释我的动机 到目前为止 我已经进行了断言式测试 这些测试引发了我自己的异常 例如 当您创建一个Node具有某些参数的对象 它会检查参数是否适合创建节
  • 沿着一系列 CGPoint 移动图像

    我将路径存储在 CGPoints 数组中 我想沿着它移动图像 这是我到目前为止的一般代码 void movePic id sender for int i 0 i lt self array count i CGPoint location
  • Android - 应用程序在棒棒糖之前的设备上崩溃

    我的应用程序在 Lollipop 设备上运行良好 但在 Lollipop 之前的版本上一直崩溃 我只是通过谷歌文档使用以下代码在我的应用程序中实现了横幅添加 Request for Ads AdRequest adRequest new A
  • 将带有模板参数的方法传递给宏

    我无法使用 Google 测试ASSERT THROW 宏与多个模板参数相结合 考虑到我想确保Matrix lt 5 1 gt throws ASSERT THROW Matrix lt 5 1 gt std runtime error 这
  • 如何将 Joomla 参数传递到 iframe(包装器)页面?

    我尝试使用 getUser 函数和位于 Joomla iframe 包装器 中的 php 脚本来获取我的用户信息 似乎将参数传递给 iframe 代码时出现问题 我捕获用户信息的唯一方法是将代码插入到基本文章 不是 iframe 中 var
  • 用于编译的 RAM 驱动器 - 有这样的东西吗?

    An answer https stackoverflow com questions 354160 what do you do while your codes compiling 354176 see below to one of
  • 匹配空格但不匹配换行符

    我有时想匹配空格而不是换行符 到目前为止我一直在求助于 t 有没有不那么尴尬的方法呢 Summary Use h匹配水平空白 自 v5 10 0 起使用 Perl https perldoc perl org perl5100delta V
  • 如何在Android平台上启用SSL调试?

    有没有类似设置的 D javax net debug ssl对于 Java 桌面应用程序 可以在命令行中使用 但是对于 Android 来说呢 我尝试通过以下方式在代码中设置它System setProperty javax net deb
  • C# 中如何测试线程是否持有某个对象的锁?

    有没有办法测试当前线程是否持有对象的监视器锁 IE 相当于 Java 中的 Thread holdsLock Thanks 我不相信有 你可以做一些糟糕的黑客事情 比如打电话Monitor Wait monitor 0 并抓住Synchro
  • MVC5 和 Ninject 的依赖注入失败

    我试图在控制器中注入几个类 但失败了 这就是我所做的 Added Ninject Web WebApi WebHost and WebActivatorExNuGet 包 在下面创建了以下类App Start NinjectWebCommo