Exemple #1
0
        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);
                    }
                }
            }
        }
Exemple #2
0
        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);
                    }
                }
            }
        }
Exemple #3
0
        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;
                        }
                    }
                }
            }
        }