2011-02-02 141 views
11

长话短说,我试图使用MVC 2和Ninject的ELMAH,并且我需要使用无参数的构造函数。我在这里创建了一个关于它的初始文章:Using a parameterless controller constructor with Ninject?使用属性注入而不是构造函数注入

我被建议使用属性注入而不是构造函数注入。

public class DepartmentsController : Controller 
{ 
    private IDepartmentsRepository departmentsRepository; 

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

    ... 
} 

这样::

public class DepartmentsController : Controller 
{ 
    private IDepartmentsRepository _departmentsRepository; 

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

    ... 
} 

但我在其他控制器的功能,我是否尝试访问DepartmentsRepository或_departmentsRepository,我得到未设置为实例的对象的引用所以我从这个移动当我尝试访问它时,出现一个对象错误。

还有什么我需要做的吗?

+6

你使用`Ninject.Web.Mvc`吗? – 2011-02-02 02:37:55

+2

等什么?什么是要求你使用无参数的构造函数? – jfar 2011-02-02 05:36:24

+0

我遇到了一个奇怪的问题,即在属性具有特定名称时,特定的依赖关系未得到解决。如果重命名它可以正常工作,但所有其他依赖项解析为正常(并且相同的依赖项在其他情况下解析为相同的属性名称)。我不知道为什么,但总是要尝试。 – 2011-05-19 11:01:12

回答

2

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

1)Ninject不知道如何绑定IDepartmentsRepository一个具体实施DepartmentsRepository的(我怀疑是,虽然这种情况)

2)如果你想在你的控制器的构造函数访问DepartmentsRepository属性,则抛出异常(因为Ninject只能在构造对象后注入Property Dependencies)。

希望有所帮助。

10

我有类似的问题。看看我的问题:Using Ninject with 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); 
    } 
} 

凡NinjectHelper在这种情况下获取当前Ninject内核

3

尝试是这样的:

的Global.asax.cs

 protected void Application_Start() 
     { 
      DependencyResolver.SetResolver(
       new MyDependencyResolver(
        new StandardKernel(
         new MyModule()))); 
      //... 
     } 

MyDependencyResolver.cs

public class MyDependencyResolver : IDependencyResolver 
    { 
     private IKernel kernel; 

     public MyDependencyResolver(IKernel kernel) 
     { 
      this.kernel = kernel; 
     } 

     public object GetService(Type serviceType) 
     { 
      return kernel.TryGet(serviceType); 
     } 

     public IEnumerable<object> GetServices(Type serviceType) 
     { 
      return kernel.GetAll(serviceType); 
     } 
    } 

MyModule.cs

public class MyModule : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<IDepartmentsRepository>().To<DepartmentsRepository>(); 
     } 
    } 
0

正如丹尼尔T.在上面发布注释,你应该看看Ninject.Web.Mvc。如果您在该项目中使用NinjectHttpApplication,它将为您自动装载所有内容,以便当NinjectControllerFactory构造一个新的控制器时,它将调用Inject()来填充属性注入。

相关问题