使用Ninject注入类(在ASP MVC3中)

时间:2011-06-10 18:13:41

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

我觉得这应该是一个常见的要求,但我无法正确地做到这一点。我目前有一个标准的MVC3站点,它使用Ninject将项目A中的服务类(单例范围)注入到控制器的构造函数中 - 这一切都正常。

我有另一个类库 - 项目B - 它需要来自Project A的类。我想要做的是注入我在Project B类中的MVC项目中使用的相同单例实例。这可能吗?

目前在global.asax中,我有这个用于设置绑定。

private void SetupDependencyInjection()
        {
            // Create Ninject DI kernel
            IKernel kernel = new StandardKernel();

            kernel.Bind<IRepositoryA>().As<RepositoryA>().InSingletonScope();
            // A load more binding go here...

            // Tell ASP.NET MVC 3 to use our Ninject DI Container
            DependencyResolver.SetResolver(new NinjectResolver(kernel));
        }

在我的控制器中,我有类似

的东西
public ExampleController(IRepositoryA iRepositoryA, more params....)
        {
            this.iRepositoryA= iRepositoryA;
            var ProjectB.Class1 = new ProjectB.Class1(this.iRepositoryA);
            // more setup of params here....
        }

我在ProjectB中有两个类看起来像这样

public class Class1
{
 public Class1(IRepositoryA iRepositoryA, more params...)
 {
  var class2 = new Class2(iRepositoryA, more params...);
 }
}

public class Class2
{
  public Class2(IRepositoryA iRepositoryA, more params...)
  {
   // Something goes here....
  }
}

我要做的是实例化ProjectB.Class1的新实例,而不必传递iClass(加上可能更多的加载)作为参数。我相信我可以从全局的asax中公开IKernel,然后执行类似iKernel.Get()的操作。这是最好的方法吗?我看到的另一个问题是注入控制器的参数可能会下降3级或更多级,例如比如上面的示例,但仅限于Class2。在这种情况下,最好不要将参数传递到链中吗?

1 个答案:

答案 0 :(得分:4)

您的控制器需要一个Class1实例,而不是IRepositoryA,因此解决方案是在控制器的构造函数中需要Class1实例:

public ExampleController(Class1 class1) {
    this.class1 = class1;
}

// Let Ninject provide these dependencies!
public Class1(IRepositoryA repositoryA, Dependency2 dependency2) {
    this.repositoyA = classB;
    this.dependency2 = dependency2;
}

(见Dependency Injection Myth: Reference Passing