1

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

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 的属性中

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

4

1 回答 1

1

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

在 step 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<IUserRepository>构造函数注入来避免循环依赖。我有一个可以帮助绑定的答案。

实际上,您的ModelFactory<>变成:

public class ModelFactory<T>
{
    [Inject]
    public Lazy<IUserRepository> UserRepository { get; set; }
}
于 2013-09-25T14:28:13.793 回答