internal static IEnumerable <TBase> GetBaseImplementations <TBase>(params object[] args) where TBase : class, IDependencyBase { if (!DependencyBases.ContainsKey(typeof(TBase).FullName())) { yield break; } foreach (var type in DependencyBases[typeof(TBase).FullName()].Where(t => DependencyBaseLatestImplementations.ContainsKey(t))) { var latestImplementationType = DependencyBaseLatestImplementations[type]; if (typeof(TBase).IsAssignableFrom(latestImplementationType)) { yield return((TBase)Activator.CreateInstance(latestImplementationType, args)); } else { var wrapper = latestImplementationType.Assembly.GetTypes() .Where(t => t.IsClass && !t.IsAbstract) .FirstOrDefault(t => typeof(IWrapper).IsAssignableFrom(t) && latestImplementationType.IsAssignableFrom(t)); if (wrapper == null) { continue; } var implementation = GetImplementation(latestImplementationType, wrapper, Version, args); if (implementation is TBase @base) { yield return(@base); } } } }
internal static IEnumerable <TBase> GetBaseImplementations <TBase, TWrapper>(params object[] args) where TBase : class, IDependencyBase where TWrapper : TBase, IWrapper { if (!DependencyBases.ContainsKey(typeof(TBase).FullName())) { yield break; } foreach (var type in DependencyBases[typeof(TBase).FullName()].Where(t => DependencyBaseLatestImplementations.ContainsKey(t))) { var implementationType = DependencyBaseLatestImplementations[type]; if (typeof(TBase).IsAssignableFrom(implementationType)) { yield return((TBase)Activator.CreateInstance(implementationType, args)); } else { var implementation = GetImplementation(implementationType, typeof(TWrapper), Version, args); if (implementation is TBase @base) { yield return(@base); } } } }
private static void UpdateDependencyBases() { DependencyBases.Clear(); DependencyBaseLatestImplementations.Clear(); foreach (var @base in DI.GetAllTypes().Where(t => t.IsAbstract || t.IsInterface)) { if (@base.IsInterface || @base.BaseType == typeof(object)) { // Interface implements an interface that implements IDependencyBase foreach (var type1 in @base.GetInterfaces(false).Where(i => i.FullName() != typeof(IDependencyBase).FullName())) { if (type1.GetInterfaces().Any(i => i.FullName() == typeof(IDependencyBase).FullName())) { if (!DependencyBases.ContainsKey(type1.FullName())) { DependencyBases.Add(type1.FullName(), new HashSet <string>()); } DependencyBases[type1.FullName()].Add(@base.FullName()); break; } } } else { if (@base.BaseType.GetInterfaces(false).Any(i => i.FullName() == typeof(IDependencyBase).FullName())) { if (!DependencyBases.ContainsKey(@base.BaseType.FullName())) { DependencyBases.Add(@base.BaseType.FullName(), new HashSet <string>()); } DependencyBases[@base.BaseType.FullName()].Add(@base.FullName()); } } } var types = DI.GetAllTypes().Where(t => t.IsClass && !t.IsAbstract).ToList(); foreach (var pair in DependencyBases) { foreach (var type in pair.Value) { var tuple = VersionUtils.GetLastImplementation(Version, types.Where(t => ReflectionUtils.ImplementsOrImplementsEquivalent(t, type, false))); if (tuple != null && tuple.Value.Type != null) { if (!DependencyBaseLatestImplementations.ContainsKey(type)) { DependencyBaseLatestImplementations.Add(type, tuple.Value.Type); } else { DependencyBaseLatestImplementations[type] = tuple.Value.Type; } } } } }