【问题标题】:Using Ninject to inject into a class (within ASP MVC3)使用 Ninject 注入类(在 ASP MVC3 中)
【发布时间】:2011-06-10 18:13:41
【问题描述】:

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

我有另一个类库 - 项目 B - 它需要来自项目 A 的类。我想要做的是注入我在项目 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。在这种情况下,是否最好继续沿链向下传递参数?

【问题讨论】:

  • 如果ProjectB.Class1直接给AuditController传一个实例不是更好吗?
  • 对不起,你指出了我的例子中的一个缺陷——我会修改。
  • 您需要提示吗?
  • 好的,我认为这是更新的。对不起,如果这没有意义,我对最好的方法有点困惑。

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


【解决方案1】:

您的控制器需要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

【讨论】:

  • Ninject 会处理所有关卡的参数,只要您在设置中指定它们
猜你喜欢
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多