我在使用依赖注入的项目中遇到循环依赖问题。在环顾四周时,似乎避免它的唯一方法,除了重组(我也做了一些),就是使用属性注入。我尝试了这个,它似乎没有帮助,但我不确定为什么。这是导致问题的路径。
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中的属性
所以我想我的问题的简短版本是:为什么属性注入没有解决我的循环依赖问题?
答案 0 :(得分: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<IUserRepository>
和构造函数注入来避免循环依赖。 I have an answer that can help with that binding.
实际上,您的ModelFactory<>
变为:
public class ModelFactory<T>
{
[Inject]
public Lazy<IUserRepository> UserRepository { get; set; }
}