2016-12-27 5 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

 Смежные вопросы

  • Нет связанных вопросов^_^