COA.EnterpriseServices/COA.EnterpriseServices.DataAccess/DataAccessManager.cs

65 lines
2.2 KiB
C#
Raw Normal View History

2020-10-14 13:27:01 +00:00
using System;
using System.Collections.Generic;
using System.Linq;
namespace COA.EnterpriseServices.DataAccess
{
2020-10-14 16:02:05 +00:00
public class DataAccessManager<T> where T : class, IRecord
2020-10-14 13:27:01 +00:00
{
2020-10-14 16:02:05 +00:00
private static readonly IDictionary<string, string[]> enabledDataAccess = new Dictionary<string, string[]>
{
#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
};
2020-10-14 13:27:01 +00:00
2020-10-14 16:02:05 +00:00
public TResult Invoke<TResult>(Func<IDataAccess<T>, TResult> func)
{
var results = new List<TResult>();
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<IDataAccess<T>> GetEnabledDataAccess()
2020-10-14 13:27:01 +00:00
{
var type = typeof(T);
2020-10-14 16:02:05 +00:00
// load data access based on active configuration
2020-10-14 13:27:01 +00:00
return Dependencies.Container
.GetAllInstances<IDataAccess<T>>()
2020-10-14 21:57:39 +00:00
.Select(i => new
{
2020-10-14 21:57:39 +00:00
Instance = i,
Type = i.GetType()
})
2020-10-14 21:57:39 +00:00
.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)
2020-10-14 13:27:01 +00:00
.ToList();
}
}
}