2016-12-27 62 views
0

我得到的错误:WCF Ninject Ninject.ActivationException

Error activating IRule using binding from IRule to Crazy 

A cyclical dependency was detected between the constructors of two services. 

我multpiple规则是我的 “WCF服务” 的规则实现接口的iRule:

public interface IRule 
{ 
    warior ExecuteRule(warrior _warrior); 
} 

例如规则疯狂的外观像这样:

public class Crazy : IRule 
    { 
     private readonly IRule _rule; 

     public Crazy(IRule rule) 
     { 
      _rule = rule; 
     } 

     public wariors ExecuteRule(warriors _warriors) 
     { 
      using (var context = new warriors_officialEntities()) 
      { 
       _warriors = context.warriors.SingleOrDefault(x => x.Name == _warriors.Name); 
       _warriors.cursed = (_warriors.Sleep > 70 && _warriors.Hunger > 70); 
       context.SaveChanges(); 
      } 
      return _warriors; 
     } 
    } 

我还使用一个ninject模块我把它称为RuleFactory。 我将一个IRule绑定到每个规则类并给他们一个名字。

public class RuleFactory : NinjectModule 
{ 

    public override void Load() 
    { 
     Bind<IRule>().To<Crazy>().Named("crazy"); 
     Bind<IRule>().To<Hungry>().Named("hunger"); 
     Bind<IRule>().To<Munchies>().Named("munchies"); 
     Bind<IRule>().To<Sleepy>().Named("sleepys"); 
    } 
} 

当我获取所有从我的服务wariors是火的方法称为DoRules(),此方法将环槽的所有战士和试图执行每一个规则为他们。

IKernel _rules = new StandardKernel(new RuleFactory()); 
public void DoRule(List<warriors> tmgs) 
     { 
      IEnumerable<IRule> rules = _rules.GetAll<IRule>(); 
      using (var context = new warriors_officialEntities()) 
      { 
       foreach (warriors tmg in tmgs) 
       { 
        foreach (var rule in rules) 
        { 
          rule.ExecuteRule(tmg); 
        } 
        tmg.LastAccess = DateTime.Now; 

        context.Entry(tmg).State = EntityState.Modified; 
       } 
       context.SaveChanges(); 
      } 
     } 

的代码将在foreach (var rule in rules)给出一个例外任何想法如何解决这一问题?

回答

1

Crazy类'收到IRule作为构造函数参数 - 但不使用它。这会导致周期性的依赖 - 但我相信您的问题中缺少相关的约束。

foreach (var rule in rules)上发生异常,因为GetAll返回的IEnumerable只会导致在实例枚举时实际检索实例。因此,在GetAll上不会发生异常,而是在循环IEnumerable时发生。

由于Crazy类实际上并没有使用IRule,所以它的注入只是将它从构造函数中移除,异常应该消失。

+0

工作!我没有看到,谢谢! – Ferryzijl