CSharp - 使用属性注入代替构造函数注入的Ninject

  显示原文与译文双语对照的内容
0 0

很长的故事,我在尝试使用ELMAH和 MVC 2和 Ninject,我需要使用无参数的构造函数。 我在这里创建了关于它的初始帖子: 使用带有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,我得到一个对象引用未设置到对象的实例错误当我试图访问它。

这里还有什么我需要做的?

时间: 原作者:

0 0

我也有类似的问题。 请查看我的问题: 使用Ninject与 Membership.Provider的

基本上当你初始化 DepartmentsController 时,你需要 incject 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内核。

原作者:
0 0

请尝试如下所示:

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 0

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

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

2 ) 如果试图在控制器的构造函数中访问DepartmentsRepository属性,则会引发异常( 因为Ninject只能在构造对象之后注入属性依赖) 。

希望有帮助

原作者:
0 0

就像 Daniel T 在上面发表的评论中所说的,你应该签出 Ninject.Web.Mvc 。 如果你在该项目中使用 NinjectHttpApplication,它将为你自动装配所有内容,因此,当NinjectControllerFactory构造一个新控制器时,它将调用 Inject() 来填充属性注入。

原作者:
...