使用属性注入而不是构造函数注入
长话短说,我正在尝试将ELMAH用于MVC 2和Ninject,我需要使用无参数构造函数。 我在这里创建了一个关于它的初始post: 在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,当我尝试访问它时,我得到的对象引用未设置为对象错误的实例 。
我还需要做些什么吗?
我有类似的问题。 看看我的问题: 使用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); } }
在这种情况下,NinjectHelper获取当前的Ninject内核。
尝试这样的事情:
的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
MyModule.cs
public class MyModule : NinjectModule { public override void Load() { Bind().To(); } }
对象引用未设置exception可能有两个原因。
1)Ninject不知道如何将IDepartmentsRepository绑定到DepartmentsRepository的具体实现(我怀疑是这种情况)
2)如果您尝试访问控制器构造函数中的DepartmentsRepository属性,它将抛出exception(因为Ninject只能在构造对象后注入Property Dependencies)。
希望有所帮助。
正如Daniel T.在上面的评论中所发表的那样,你应该看看Ninject.Web.Mvc
。 如果你在该项目中使用NinjectHttpApplication,它会为你自动assembly一切,这样当NinjectControllerFactory构造一个新的控制器时,它会调用Inject()来填充属性注入。
- 违反类型的inheritance安全规则:’MySql.Data.Entity.MySqlEFConfiguration’
- 根据存储的时区修改ASP.NET MVC C#中的日期
- 剃刀页面上的Dropzone返回400状态代码
- 如何使用linq查询ASP.NET MVC 5entity framework填充视图模型
- MVC 3尝试将URL启动到View而不是控制器操作
- IE VS Chrome和Firefox中的网络安全(bug)
- ASP.NET MVC基于域和主机名的路由
- 如何在_Layout.cshtml中的导航栏中创建徽章接收值
- 如何在Application_Error()中知道asp.net中的请求是ajax