WCF Ninject Ninject.ActivationException

WCF Ninject Ninject.ActivationException

我收到错误:

    Error activating IRule using binding from IRule to Crazy

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

我有多个规则是我的 "WCF service" 规则实现接口 IRule:

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

例如,Crazy 规则如下所示:

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 绑定到每个规则 class 并给它们命名。

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

当我从我的服务中检索所有勇士时,会触发一个名为 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) 中给出异常,知道如何解决这个问题吗?

Crazy class' 接收一个 IRule 作为构造函数参数 - 但不使用它。这会导致循环依赖 - 但我相信您的问题中缺少相关绑定。

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

时发生

因为 Crazy class 实际上并没有使用 IRule 它被注入只是从构造函数中删除它并且异常应该消失。