这是我的依赖注射设置:
dIcontainer.Bind<DBContext>().ToSelf().InRequestScope();
//Repository accepts a constructor parameter DBContext
dIcontainer.Bind<IRepository1, Repository1>();
dIcontainer.Bind<IRepository2, Repository2>();
//All strategies accepts a constructor parameter of a repository interface
//There is one strategy per repository
dIcontainer.Bind(x => x.FromThisAssembly().SelectAllClasses().InheritedFrom<IStrategy>().BindSingleInterface());
//The factory accepts a constructor parameter of IEnumerable<IStrategy>
dIcontainer.Bind<StrategyFactory>().ToSelf();
工厂的实施:
public class StrategyFactory
{
private IEnumerable<IStrategy> _strategies;
public StrategyFactory(IEnumerable<IStrategy> strategies)
{
_strategies = strategies;
}
public IStrategy GetStrategy(string keyToMatch)
{
return _strategies.Single(strategy => strategy.IsStrategyMatch(keyToMatch));
}
}
存储库和上下文位于一个单独的项目中。
当我调用GetStrategy方法(解析DI树)时,我收到此错误:
使用绑定来激活IStrategy时出错 战略的战略1周期性的 在两个服务的构造函数之间检测到依赖性。
如果我在每个策略构造函数中新建存储库:
public Strategy1()
{
_repository = new Repository1(new DBContext());
}
我在工厂中获得了完整的策略列表,可以根据keyToMatch解决相关策略。 我做错了什么?
让我知道问题是否过于紧凑。
答案 0 :(得分:0)
循环依赖意味着:
策略1需要Repository1需要Foobar需要Strategy1的需求(并且开启和开启,抱歉但是世界上没有足够的磁盘空间来正确完成这个示例)
所以你看,解决这个问题最终会导致StackoverflowException
。对于Strategy1
Foobar
,对于Repository1
而言,解析器会针对Strategy1
解析Foobar
InSingletonScope()
...
你需要确定周期并打破它。要么你实际上真的打破了它,否则你可能会让一个组件使用InRequestScope()
或Lazy<T>
(如果适用)这样的范围并懒惰地注入它而不是将其注入ctor。您可以使用Ninject.Extensions.Factory和Func<T>
或portal_type
。