Ejemplo n.º 1
0
        private static void UpdateDependencies()
        {
            var interfaces = DI.GetAllTypes()
                             .Where(t => t.IsAbstract || t.IsInterface)
                             .Where(t => t.GetInterfaces(false).Any(i => i.FullName == typeof(IDependency).FullName));

            foreach (var @interface in interfaces)
            {
                var types = DI.GetAllTypes()
                            .Where(t => t.IsClass && !t.IsAbstract)
                            .Where(t => ReflectionUtils.ImplementsOrImplementsEquivalent(t, @interface));
                var tuple = VersionUtils.GetLastImplementation(Version, types);
                if (tuple != null && tuple.Value.Type != null)
                {
                    LatestImplementations.Add(@interface, tuple.Value.Type);
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Foolproofing. Custom implementations can be wrapped, but we can't be sure if they are correct.
        /// Do checking until we find the first correct one
        /// </summary>
        private static object?GetImplementationRecursive(Type baseType, Type wrapperType, object[] args, IEnumerable <Type> types)
        {
            var tuple = VersionUtils.GetLastImplementation(Version, types);

            if (tuple == null || tuple?.Type == null)
            {
                return(null);
            }

            var obj = Activator.CreateInstance(tuple?.Type, args);

            if (baseType.IsAssignableFrom(tuple?.Type))
            {
                return(obj);
            }
            else
            {
                var wrapperObject = Activator.CreateInstance(wrapperType, obj);
                return(wrapperObject is IWrapper wrapper && wrapper.IsCorrect
                    ? wrapperObject
                    : GetImplementationRecursive(baseType, wrapperType, args, types.Where(t => t != tuple?.Type)));
            }
        }
Ejemplo n.º 3
0
        private static void UpdateDependencies()
        {
            LatestImplementations.Clear();

            var bases = DI.GetAllTypes()
                        .Where(t => t.IsAbstract || t.IsInterface)
                        .Where(t =>
                               t.GetInterfaces(false).Any(i => i.FullName() == typeof(IDependency).FullName()) &&
                               t.GetInterfaces(true).All(i => FullName(i) != typeof(IWrapper).FullName()))
                        .Select(i => i.FullName())
                        .Distinct();

            foreach (var @base in bases)
            {
                var types = DI.GetAllTypes()
                            .Where(t => t.IsClass && !t.IsAbstract)
                            .Where(t => ReflectionUtils.ImplementsOrImplementsEquivalent(t, @base));
                var tuple = VersionUtils.GetLastImplementation(Version, types);
                if (tuple != null && tuple.Value.Type != null)
                {
                    LatestImplementations.Add(@base, tuple.Value.Type);
                }
            }
        }