using System; using System.Collections.Generic; using System.Linq; namespace COA.EnterpriseServices.DataAccess { public class DataAccessManager where T : class, IRecord { private static readonly IDictionary enabledDataAccess = new Dictionary { #region Creditor ["COA.EnterpriseServices.DataAccess.Entities.Creditor"] = new[] { "COA.EnterpriseServices.DataAccess.QuickBase.QuickBaseDataAccess", "COA.EnterpriseServices.DataAccess.EntityFramework.EntityDataAccess" }, #endregion #region Client ["COA.EnterpriseServices.DataAccess.Entities.Client"] = new[] { "COA.EnterpriseServices.DataAccess.QuickBase.QuickBaseDataAccess", "COA.EnterpriseServices.DataAccess.EntityFramework.EntityDataAccess" } #endregion }; public TResult Invoke(Func, TResult> func) { var results = new List(); var dataAccessInstances = GetEnabledDataAccess(); foreach (var dataAccessInstance in dataAccessInstances) { results.Add(func(dataAccessInstance)); } // if the "EF" version invokes first, return that value return results.FirstOrDefault(r => r != null && !r.Equals(default(TResult))); } private ICollection> GetEnabledDataAccess() { var type = typeof(T); // load data access based on active configuration return Dependencies.Container .GetAllInstances>() .Select(i => new { Instance = i, Type = i.GetType() }) .Where(i => enabledDataAccess.ContainsKey(type.FullName) && enabledDataAccess[type.FullName].Any(a => i.Type.FullName.StartsWith(a))) .OrderBy(i => i.Type.Name.StartsWith("QuickBase", StringComparison.OrdinalIgnoreCase)) .Select(i => i.Instance) .ToList(); } } }