using System; using System.Collections.Generic; using System.Linq; using System.Text; 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>() .Where(i => { var dataAccessType = i.GetType().FullName; return enabledDataAccess.ContainsKey(type.FullName) && enabledDataAccess[type.FullName].Any(a => dataAccessType.StartsWith(a)); }) .OrderBy(i => i.GetType().Name.StartsWith("QuickBase", StringComparison.OrdinalIgnoreCase)) .ToList(); } } }