示例#1
0
        public override Entity Resolve(Entity owner, string key, bool fallback = false)
        {
            using (cycleChecker = cycleChecker?.SpawnChild() ?? new CycleChecker <Resolution>(ExceptionTexts.ContentProviderCycle,
                                                                                              () => cycleChecker = null))
            {
                fallback = false;
                IEntityContentProvider provider = GetContentProvider();
                if (provider == null)
                {
                    fallback = true;
                    provider = GetContentProvider();
                }
                if (provider == null)
                {
                    throw new ContentProviderException(key, owner);
                }

                cycleChecker.AddItem(new Resolution(owner, key, provider));
                return(provider.Resolve(owner, key, fallback));
            }

            IEntityContentProvider GetContentProvider()
            {
                return(contentResolvers.Where(r => !cycleChecker.HasItem(new Resolution(owner, key, r)))
                       .FirstOrDefault(r => r.CanResolve(owner, key, fallback))
                       ?? contentResolvers.FirstOrDefault(r => r.CanResolve(owner, key, fallback)));
            }
        }
示例#2
0
        public override bool CanResolve(Entity owner, string key, bool fallback = false)
        {
            if (cycleChecker?.HasItem(new Resolution(owner, key)) == true)
            {
                //break cycles before they form
                return(false);
            }
            using (canCycleChecker = canCycleChecker?.SpawnChild() ?? new CycleChecker <Resolution>(ExceptionTexts.ContentProviderCycle,
                                                                                                    () => canCycleChecker = null))
            {
                Resolution resolution = new Resolution(owner, key);
                canCycleChecker.AddItem(resolution);
                bool result = contentResolvers.Any(r => r.CanResolve(owner, key, false));
                if (!result)
                {
                    canCycleChecker.RemoveAfter(resolution);
                    result = contentResolvers.Any(r => r.CanResolve(owner, key, true));
                }

                return(result);
            }
        }