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