2016-12-27 1 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 서비스"규칙이 인터페이스 아이 룰 구현입니다 : 규칙 미친 외모 예를 들어

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

을 like :

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; 
     } 
    } 

나는 또한 RuleFactory라고 부르는 ninject 모듈을 사용하고 있습니다. 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

클래스 '는 IRule을 생성자 매개 변수로 받지만 사용하지는 않습니다. 이것은 주기적으로 의존성을 유발하지만, 귀하의 질문에 관련 바인딩이 없다고 생각합니다.

GetAll이 열거 된 경우 인스턴스를 실제로 검색하는 것으로 연결되는 IEnumerable을 반환하기 때문에 예외는 foreach (var rule in rules)에서 발생합니다. 따라서 GetAll에서 예외가 발생하지 않고 IEnumerable을 반복 할 때 예외가 발생합니다.

Crazy 클래스는 실제로 생성자에서 제거하고 예외가 사라져야 만합니다. 실제로는 IRule 클래스를 사용하지 않습니다.

+0

그게 효과가 있습니다! 나는 그것을 보지 못했다. 고마워! – Ferryzijl