Ninject:控制器的实体上下文

Kye*_*ica 5 c# dependency-injection ninject entity-framework-4.1 asp.net-mvc-3

我知道有人提出了一千零一个与这个话题有关的问题,但我至少经历了十几个问题,但仍然没有联系到这些问题.我正在尝试为实体上下文设置依赖注入.

我总是创建我的实体上下文,就像我在MS教程中看到的那样,如下所示:

public class UserController : Controller
{
    private DbEntities db = new DbEntities();

}
Run Code Online (Sandbox Code Playgroud)

最近的阅读告诉我,这不再是(如果有的话)最佳实践,应该使用依赖注入方法.Ninject经常被提及,但我看到你如何从我拥有的东西转移到Ninject文档中的示例.

我完成后应该看起来像这样,对吧?

public class UserController : Controller
{
    private DbEntities db;

    public UserController(DbEntities context)
    {
        db = context;
    }
}
Run Code Online (Sandbox Code Playgroud)

文档以"在上一步中我们已准备好控制器注入所需的任何内容"开始.因为上一步是安装,所以这很混乱.我使用Nuget方法进行安装,但是当我说"现在加载模块或在RegisterServices方法中定义绑定"时,我不知道它意味着什么.我该怎么做,实体是模块还是绑定?文档感觉很稀疏.

我很抱歉,如果我跳过文档中的一些重要内容,我已经在论坛之间徘徊数小时试图弄清楚这一步.

Bro*_*ass 4

我使用 Nuget 方法进行安装,但我不知道“现在加载模块或在 RegisterServices 方法中定义绑定”是什么意思。我该如何做到这一点,实体是模块还是绑定?

Nuget 安装实际上已经为您做了很多事情。最重要的是,它将 Ninject 设置为控制器工厂,这意味着 Ninject 将创建您的控制器,并能够传入您注册的所有依赖项。

如果您检查 App_Start 文件夹,您会发现一个文件NinjectMVC3.cs。已经有一个空方法RegisterServices()可用于注册您的依赖项。

对于您的示例,您必须能够解决DbEntities. 最简单最基本的方法是:

kernel.Bind<DbEntities>().ToSelf();
Run Code Online (Sandbox Code Playgroud)

也就是说,您确实应该向控制器传递一个接口,以便控制器不依赖于实体框架,使用抽象并注册一个具体类以在 IoC 容器中使用是依赖注入的主要原因之一。

这应该给您一个开始 - 您链接到的文档似乎有点过时。我建议查看github 上的Ninject MVC3 示例