【问题标题】:Ninject cyclic dependency - already using property injectionNinject 循环依赖 - 已经在使用属性注入
【发布时间】:2013-10-01 04:27:28
【问题描述】:

我在使用依赖注入的项目中遇到循环依赖问题。环顾四周,似乎避免它的唯一方法,除了重组(我也做了一些),就是使用属性注入。我试过这个,它似乎没有帮助,但我不知道为什么。这是导致问题的路径。

Activation path:
  6) Injection of dependency IUserRepository into property UserRepository of type ModelFactory{UserRole}
  5) Injection of dependency IUserRoleFactory into parameter userRoleFactory of constructor of type UserRoleService
  4) Injection of dependency IUserRoleService into property UserRoleService of type InternalUserBehavior
  3) Injection of dependency IInternalUserBehavior into parameter internalUserBehavior of constructor of type UserRepository
  2) Injection of dependency IUserRepository into parameter userRepository of constructor of type HomeController
  1) Request for HomeController

现在,它似乎知道它正在使用属性注入,并且所有的行为和工厂都在同一个范围内(现在调用范围,但我也尝试过线程范围),以及 UserRepository。

我对这个过程的理解是它应该达到 4,并且能够实际创建对象。此时,它应该具有对 HomeController、IUserRepository 和 IInternalUserBehavior 的引用。然后它应该在 5 上工作,并将完成的 IUserRoleService 插入到 InternalUserBehavior 中。最后,它应该将先前实例化的用户存储库(因为它在同一范围内)插入到 ModelFactory 的属性中

所以我想我的问题的简短版本是:为什么属性注入不能解决我的循环依赖问题?

【问题讨论】:

    标签: c# dependency-injection ninject property-injection cyclic-dependency


    【解决方案1】:

    查看您的代码会有所帮助...但我认为您不了解这里的过程。

    在步骤4),Ninject 刚刚创建了InternalUserBehavior 并正在注入属性。在步骤5) 中,Ninject 发现它需要创建UserRoleService 并继续执行步骤6) 创建并填充ModelFactory{UserRole}

    我假设您的课程看起来像:

    public class UserRoleService
    {
       public UserRoleService(ModelFactory<UserRole> factory){}
    }
    
    public class ModelFactory<T>
    {
        [Inject]
        public IUserRepository UserRepository { get; set; }
    }
    

    你肯定有一个循环依赖,不管属性注入。你需要解决循环依赖。

    另一种方法是使用 Lazy&lt;IUserRepository&gt; 和构造函数注入来避免循环依赖。 I have an answer that can help with that binding.

    实际上,您的ModelFactory&lt;&gt; 变为:

    public class ModelFactory<T>
    {
        [Inject]
        public Lazy<IUserRepository> UserRepository { get; set; }
    }
    

    【讨论】:

    • 实际上,是的,这些类看起来像这样。是的,我知道存在循环依赖,但到目前为止我还无法绕过它,这就是我尝试属性注入的原因。我现在正在看那个惰性绑定。
    • 看起来延迟初始化工作正常,因此将其标记为答案。我可能会在稍后尝试解决循环依赖关系,但现在,这会让事情发生变化。感谢您的帮助!
    猜你喜欢
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 2016-11-30
    • 1970-01-01
    • 2011-04-06
    相关资源
    最近更新 更多