如何从已经解析的实例中注入相同激活过程中的依赖?

时间:2012-02-08 23:00:37

标签: dependency-injection inversion-of-control ninject

我没有找到这个问题的简短形式作为主题......

是否可以将已解析的实例的属性注入依赖项实例的构造函数?

我的问题来自于2009年创建的MVC tutorial。 这似乎是对我的循环依赖。

无论如何,我可以:

  • 获取已解析的ContactController(或其基本Controller,清单3)实例的属性ModelState
  • 并将其注入其依赖关系ContactService(清单4)实例依赖关系ModelStateWrapper(清单7)。
  • 作为构造函数参数。

_service = new ContactManagerService(new ModelStateWrapper(this.ModelState));(清单8之后。)

如何使用DI容器完成上述行?

我知道服务层中发生的验证可以通过数据注释或自定义属性来完成,我的问题不是关于设计或架构,而是可能性。

我已经阅读了Ninject wiki,一些博客文章,答案,甚至发现了一些类似的情况,但不完全是这样,或者无法弄清楚如何实现这一点,或者是否可以使用Ninject。

BR,

1 个答案:

答案 0 :(得分:1)

不,你不能

要查看问题,您必须考虑创建对象的顺序

var modelStateWrapper = new ModelStateWrapper();
var service = new ContactService(modelStateWrapper);
var controller = new ContactController(service);

这意味着在控制器之前很久就创建了modelstate包装器,因此无法将模型状态传递给ModelStateWrapper的构造函数。唯一可行的是在某处使用Property Injection,但这只是实际问题的一种解决方法,即你有一个循环依赖。

该实现还将服务紧密地绑定到控制器。请考虑使用ModelValidators。