使用ninject创建策略模式时出现周期性依赖性错误

时间:2016-04-13 10:21:28

标签: c# ninject factory-pattern strategy-pattern

这是我的依赖注射设置:

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解决相关策略。 我做错了什么?

让我知道问题是否过于紧凑。

1 个答案:

答案 0 :(得分:0)

循环依赖意味着:

  

策略1需要Repository1需要Foobar需要Strategy1的需求(并且开启和开启,抱歉但是世界上没有足够的磁盘空间来正确完成这个示例)

所以你看,解决这个问题最终会导致StackoverflowException。对于Strategy1 Foobar,对于Repository1而言,解析器会针对Strategy1解析Foobar InSingletonScope() ...

你需要确定周期并打破它。要么你实际上真的打破了它,否则你可能会让一个组件使用InRequestScope()Lazy<T>(如果适用)这样的范围并懒惰地注入它而不是将其注入ctor。您可以使用Ninject.Extensions.Factory和Func<T>portal_type

相关问题