public void CircularMustBeAfterIsBad()
        {
            //Arrange
            var finder = new RegistrantFinderBuilder()
                         .UsingTypeFinder(new SimpleTypesFinder(typeof(R02Last), typeof(R03Last)))
                         .Build();

            //Act
            Action action = () => finder.GetAllRegistrations();

            //Assert
            action.Should().Throw <CircularRegistrantDependencyException>();
        }
        public void IgnoreManuals()
        {
            //Arrange
            var finder = new RegistrantFinderBuilder()
                         .UsingTypeFinder(new SimpleTypesFinder(typeof(R01), typeof(R02Manual), typeof(R03)))
                         .Build();

            //Act
            var elements = finder.GetAllRegistrations().ToArray();

            //Assert
            elements.Length.Should().Be(6);
            elements[0].Should().Be(E01);
            elements[1].Should().Be(E02);
            elements[2].Should().Be(E03);
            elements[3].Should().Be(E07);
            elements[4].Should().Be(E08);
            elements[5].Should().Be(E09);
        }
        public void IngoreMustBeAfterIfNotThere()
        {
            //Arrange
            var finder = new RegistrantFinderBuilder()
                         .UsingTypeFinder(new SimpleTypesFinder(typeof(R01Last), typeof(R02Middle)))
                         .Build();

            //Act
            var elements = finder.GetAllRegistrations().ToArray();

            //Assert
            elements.Length.Should().Be(6);
            elements[0].Should().Be(E04);
            elements[1].Should().Be(E05);
            elements[2].Should().Be(E06);
            elements[3].Should().Be(E01);
            elements[4].Should().Be(E02);
            elements[5].Should().Be(E03);
        }
Example #4
0
        /// <inheritdoc />
        public IEnumerable <PluginInfo> LoadPlugins(IEnumerable <PluginInfo> currentCatalog, IEnumerable <string> pluginPaths, IInstanceResolverHelper resolverHelper, RegistrantFinderBuilder registrantFinderBuilder = null, IEnumerable <string> forcedPlugins = null)
        {
            var registrantBuilder = registrantFinderBuilder ?? new RegistrantFinderBuilder();

            var forced         = forcedPlugins?.ToArray() ?? new string[0];
            var catalog        = currentCatalog?.ToArray() ?? new PluginInfo[0];
            var dirs           = pluginPaths.Select(x => new DirectoryInfo(x)).Where(x => x.Exists);
            var excludedPrefix = new[]
            {
                "System.",
                "Microsoft.",
                "SimplyAnIcon.Plugins",
                "SimplyAnIcon.Common",
                "SimplyAnIcon.Core",
                "netstandard.dll"
            };

            var dlls = dirs.SelectMany(dir => dir.GetFiles("*.dll", SearchOption.AllDirectories))
                       .Where(d => excludedPrefix.All(x => !d.Name.StartsWith(x))).ToArray();

            if (!dlls.Any())
            {
                return(catalog);
            }

            var assemblies = dlls.Select(x => Assembly.LoadFile(x.FullName)).ToList();

            assemblies.ForEach(x => registrantBuilder.AddAssembly(x));

            var pTypes = assemblies.SelectMany(x =>
                                               x.DefinedTypes.Where(p =>
                                                                    p.IsClass && !p.IsAbstract && typeof(ISimplyAPlugin).IsAssignableFrom(p)))
                         .ToArray();

            resolverHelper.EverythingIsRegistered(registrantBuilder.Build().GetAllRegistrations());

            var plugins = pTypes
                          .Select(resolverHelper.Resolve)
                          .Cast <ISimplyAPlugin>()
                          .ToArray();

            var pluginSettings = _pluginSettings.GetPlugins().ToArray();

            foreach (var plugin in plugins.Where(p => pluginSettings.All(x => x.Name != _pluginSettings.GetPluginName(p))))
            {
                _pluginSettings.AddPlugin(plugin);
            }

            var newCatalog = plugins
                             .Select(x => new { Plugin = x, Setting = _pluginSettings.GetPluginSetting(x) })
                             .OrderBy(x => x.Setting?.Order ?? -1)
                             .Select(x => new PluginInfo
            {
                Plugin      = catalog.FirstOrDefault(o => o.Plugin.Name == x.Plugin.Name)?.Plugin ?? x.Plugin,
                IsActivated = forced.Contains(x.Setting?.Name) || (x.Setting?.IsActive ?? false),
                IsNew       = catalog.All(o => o.Plugin.Name != x.Plugin.Name)
            })
                             .ToArray();

            foreach (var plugin in newCatalog.Where(x => x.IsNew).ToArray())
            {
                try
                {
                    plugin.Plugin.OnInit(_pluginBasicConfigHelper.GetPluginBasicConfig());
                }
                catch
                {
                    newCatalog = newCatalog.Except(new[] { plugin }).ToArray();
                }
            }

            return(newCatalog);
        }