使用属性注入而不是构造函数注入

Ste*_*ven 12 c# asp.net-mvc elmah ninject

长话短说,我正在尝试将ELMAH用于MVC 2和Ninject,我需要使用无参数构造函数.我在这里创建了一个关于它的初始帖子:在Ninject中使用无参数控制器构造函数?

我被建议使用属性注入而不是构造函数注入.所以我离开了这个:

public class DepartmentsController : Controller
{
    private IDepartmentsRepository departmentsRepository;

    public DepartmentsController(IDepartmentsRepository departmentsRepository)
    {
        this.departmentsRepository = departmentsRepository;
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

对此:

public class DepartmentsController : Controller
{
    private IDepartmentsRepository _departmentsRepository;

    [Inject]
    public IDepartmentsRepository DepartmentsRepository
    {
        get { return _departmentsRepository; }
        set { _departmentsRepository = value; }
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

但在我的其他控制器函数中,无论我是否尝试访问DepartmentsRepository或_departmentsRepository,当我尝试访问它时,我得到的对象引用未设置为对象错误的实例.

我还需要做些什么吗?

lan*_*der 11

我遇到了类似的问题.看看我的问题:使用Ninject和Membership.Provider.

基本上,当你初始化时,DepartmentsController你需要注入this(即你的部门控制器进入你的Ninject核心.所以它的东西像:

public class DepartmentsController : Controller
{
  private IDepartmentsRepository _departmentsRepository;

  [Inject]
  public IDepartmentsRepository DepartmentsRepository
  {
    get { return _departmentsRepository; }
    set { _departmentsRepository = value; }
  }

  public DepartmentsController()
  {
    NinjectHelper.Kernel.Inject(this);
  }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,NinjectHelper获取当前的Ninject内核.

  • 这将有效,但使用ControllerFactory进行注入是一个更好的主意,因此控制器不必了解Ninject. (6认同)

Rag*_*ghu 2

对象引用未设置异常可能有两个原因。

1) Ninject 不知道如何将 IDepartmentsRepository 绑定到 DepartmentsRepository 的具体实现(但我怀疑情况确实如此)

2)如果您尝试在控制器的构造函数中访问 DepartmentsRepository 属性,它将抛出异常(因为 Ninject 只能在构造对象后注入属性依赖项)。

希望有帮助。