Ejemplo n.º 1
0
        public async Task PluginCanContainManyTags()
        {
            var catalog = new TypePluginCatalog(typeof(TypePlugin),
                                                new TypePluginCatalogOptions()
            {
                TypeFinderOptions = new TypeFinderOptions()
                {
                    TypeFinderCriterias = new List <TypeFinderCriteria>()
                    {
                        TypeFinderCriteriaBuilder.Create().Tag("MyTag_1"),
                        TypeFinderCriteriaBuilder.Create().Tag("AnotherTag")
                    }
                }
            });

            await catalog.Initialize();

            var plugin = catalog.Single();

            var coll = new List <string>()
            {
                "MyTag_1", "AnotherTag"
            };

            Assert.Equal(coll, plugin.Tags);
        }
Ejemplo n.º 2
0
        public async Task Initialize()
        {
            var converter = new DelegateToTypeWrapper();

            // Convert this catalog's options to the format supported by Delegate Wrapper.
            // TODO: At some good point change the catalog so that it uses the Delegate Wrapper's options instead of defining its own.
            var delegateToTypeWrapperOptions = ConvertOptions();
            var assembly = converter.CreateType(_multicastDelegate, delegateToTypeWrapperOptions);

            var options = new TypePluginCatalogOptions()
            {
                PluginNameOptions = _options.NameOptions
            };

            if (_options.Tags?.Any() == true)
            {
                options.TypeFinderOptions = new TypeFinderOptions
                {
                    TypeFinderCriterias = new List <TypeFinderCriteria> {
                        TypeFinderCriteriaBuilder.Create().Tag(_options.Tags.ToArray())
                    }
                };
            }

            _catalog = new TypePluginCatalog(assembly, options);
            await _catalog.Initialize();

            IsInitialized = true;
        }
        public NugetPackagePluginCatalog(string packageName, string packageVersion = null, bool includePrerelease                     = false, NuGetFeed packageFeed = null,
                                         string packagesFolder             = null, Action <TypeFinderCriteriaBuilder> configureFinder = null, Dictionary <string, TypeFinderCriteria> criterias = null,
                                         NugetPluginCatalogOptions options = null)
        {
            _packageName       = packageName;
            _packageVersion    = packageVersion;
            _includePrerelease = includePrerelease;
            _packageFeed       = packageFeed;

            PackagesFolder = packagesFolder ?? Path.Combine(Path.GetTempPath(), "NugetPackagePluginCatalog", Path.GetRandomFileName());

            if (!Directory.Exists(PackagesFolder))
            {
                Directory.CreateDirectory(PackagesFolder);
            }

            if (criterias == null)
            {
                criterias = new Dictionary <string, TypeFinderCriteria>();
            }

            _typeFinderCriterias = criterias;
            _options             = options ?? new NugetPluginCatalogOptions();

            if (configureFinder != null)
            {
                var builder = new TypeFinderCriteriaBuilder();
                configureFinder(builder);

                var criteria = builder.Build();

                _typeFinderCriterias.Add("", criteria);
            }
        }
Ejemplo n.º 4
0
        public static IServiceCollection AddPluginFramework <TType>(this IServiceCollection services, string dllPath = "") where TType : class
        {
            services.AddPluginFramework();

            if (string.IsNullOrWhiteSpace(dllPath))
            {
                var entryAssembly = Assembly.GetEntryAssembly();

                if (entryAssembly == null)
                {
                    dllPath = Environment.CurrentDirectory;
                }
                else
                {
                    dllPath = Path.GetDirectoryName(entryAssembly.Location);
                }
            }

            var typeFinderCriteria = TypeFinderCriteriaBuilder.Create()
                                     .AssignableTo(typeof(TType))
                                     .Build();

            var catalog = new FolderPluginCatalog(dllPath, typeFinderCriteria);

            services.AddPluginCatalog(catalog);

            services.AddPluginType <TType>();

            return(services);
        }
        public FolderPluginCatalog(string folderPath, Action <TypeFinderCriteriaBuilder> configureFinder, TypeFinderCriteria finderCriteria,
                                   FolderPluginCatalogOptions options)
        {
            if (string.IsNullOrWhiteSpace(folderPath))
            {
                throw new ArgumentNullException(nameof(folderPath));
            }

            _folderPath = folderPath;
            _options    = options ?? new FolderPluginCatalogOptions();

            if (configureFinder != null)
            {
                var builder = new TypeFinderCriteriaBuilder();
                configureFinder(builder);

                var criteria = builder.Build();

                _options.TypeFinderCriterias.Add("", criteria);
            }

            if (finderCriteria != null)
            {
                _options.TypeFinderCriterias.Add("", finderCriteria);
            }

            if (_options.TypeFinderCriteria != null)
            {
                _options.TypeFinderCriterias.Add("", _options.TypeFinderCriteria);
            }
        }
Ejemplo n.º 6
0
        public async Task Initialize()
        {
            var converter = new DelegateToAssemblyConverter();
            var assembly  = converter.CreateAssembly(_multicastDelegate, _options);

            var options = new AssemblyPluginCatalogOptions()
            {
                PluginNameOptions = _options.NameOptions
            };

            if (_options.Tags?.Any() == true)
            {
                options.TypeFinderOptions = new TypeFinderOptions
                {
                    TypeFinderCriterias = new List <TypeFinderCriteria> {
                        TypeFinderCriteriaBuilder.Create().Tag(_options.Tags.ToArray())
                    }
                };
            }

            _catalog = new AssemblyPluginCatalog(assembly, options);
            await _catalog.Initialize();

            IsInitialized = true;
        }
Ejemplo n.º 7
0
        public async Task FolderOptionsAreUsedToLimitLoadedAssemblies()
        {
            var options = new FolderPluginCatalogOptions
            {
                TypeFinderOptions = new TypeFinderOptions()
                {
                    TypeFinderCriterias = new List <TypeFinderCriteria>()
                    {
                        TypeFinderCriteriaBuilder
                        .Create()
                        .HasName("SecondPlugin")
                        .Tag("MyPlugin"),
                    }
                }
            };

            var catalog = new FolderPluginCatalog(_pluginFolder, options);

            await catalog.Initialize();

            var field = catalog.GetType().GetField("_catalogs", BindingFlags.Instance | BindingFlags.NonPublic);
            // ReSharper disable once PossibleNullReferenceException
            var loadedAssemblies = (List <AssemblyPluginCatalog>)field.GetValue(catalog);

            // ReSharper disable once AssignNullToNotNullAttribute
            Assert.Single(loadedAssemblies);
        }
Ejemplo n.º 8
0
        public async Task CanUseFolderOptions()
        {
            var options = new FolderPluginCatalogOptions
            {
                TypeFinderOptions = new TypeFinderOptions()
                {
                    TypeFinderCriterias = new List <TypeFinderCriteria>()
                    {
                        TypeFinderCriteriaBuilder
                        .Create()
                        .HasName("SecondPlugin")
                        .Tag("MyPlugin"),
                    }
                }
            };

            var catalog = new FolderPluginCatalog(_pluginFolder, options);

            await catalog.Initialize();

            var pluginCount = catalog.GetPlugins().Count;

            Assert.Equal(1, pluginCount);
            Assert.Equal("SecondPlugin", catalog.Single().Type.Name);
        }
Ejemplo n.º 9
0
        public void ConfigureServices(IServiceCollection services)
        {
            TypeFinderOptions.Defaults.TypeFinderCriterias.Add(TypeFinderCriteriaBuilder.Create().Implements <IOperator>().Tag("MathOperator"));
            TypeFinderOptions.Defaults.TypeFinderCriterias.Add(TypeFinderCriteriaBuilder.Create().Tag("All"));
            services.AddPluginFramework();

            services.AddControllers();
        }
        public FolderPluginCatalog(string folderPath, Action <TypeFinderCriteriaBuilder> configureFinder, TypeFinderCriteria finderCriteria,
                                   FolderPluginCatalogOptions options)
        {
            if (string.IsNullOrWhiteSpace(folderPath))
            {
                throw new ArgumentNullException(nameof(folderPath));
            }

            _folderPath = folderPath;
            _options    = options ?? new FolderPluginCatalogOptions();

            if (_options.TypeFinderOptions == null)
            {
                _options.TypeFinderOptions = new TypeFinderOptions();
            }

            if (_options.TypeFinderOptions.TypeFinderCriterias == null)
            {
                _options.TypeFinderOptions.TypeFinderCriterias = new List <TypeFinderCriteria>();
            }

            if (configureFinder != null)
            {
                var builder = new TypeFinderCriteriaBuilder();
                configureFinder(builder);

                var criteria = builder.Build();

                _options.TypeFinderOptions.TypeFinderCriterias.Add(criteria);
            }

            if (finderCriteria != null)
            {
                _options.TypeFinderOptions.TypeFinderCriterias.Add(finderCriteria);
            }

            if (_options.TypeFinderCriteria != null)
            {
                _options.TypeFinderOptions.TypeFinderCriterias.Add(_options.TypeFinderCriteria);
            }

            if (_options.TypeFinderCriterias?.Any() == true)
            {
                foreach (var typeFinderCriteria in _options.TypeFinderCriterias)
                {
                    var crit = typeFinderCriteria.Value;
                    crit.Tags = new List <string>()
                    {
                        typeFinderCriteria.Key
                    };

                    _options.TypeFinderOptions.TypeFinderCriterias.Add(crit);
                }
            }
        }
        private void SetFilters(Predicate <Type> filter, Dictionary <string, Predicate <Type> > taggedFilters, TypeFinderCriteria criteria,
                                Action <TypeFinderCriteriaBuilder> configureFinder)
        {
            if (_options.TypeFinderCriterias == null)
            {
                _options.TypeFinderCriterias = new Dictionary <string, TypeFinderCriteria>();
            }

            if (filter != null)
            {
                var filterCriteria = new TypeFinderCriteria {
                    Query = (context, type) => filter(type)
                };

                _options.TypeFinderCriterias.Add(string.Empty, filterCriteria);
            }

            if (taggedFilters?.Any() == true)
            {
                foreach (var taggedFilter in taggedFilters)
                {
                    var taggedCriteria = new TypeFinderCriteria {
                        Query = (context, type) => taggedFilter.Value(type)
                    };

                    _options.TypeFinderCriterias.Add(taggedFilter.Key, taggedCriteria);
                }
            }

            if (configureFinder != null)
            {
                var builder = new TypeFinderCriteriaBuilder();
                configureFinder(builder);

                var configuredCriteria = builder.Build();

                _options.TypeFinderCriterias.Add("", configuredCriteria);
            }

            if (criteria != null)
            {
                _options.TypeFinderCriterias.Add("", criteria);
            }

            if (_options.TypeFinderCriterias?.Any() != true)
            {
                var findAll = TypeFinderCriteriaBuilder
                              .Create()
                              .Build();

                _options.TypeFinderCriterias.Add(string.Empty, findAll);
            }
        }
Ejemplo n.º 12
0
        public NugetFeedPluginCatalog(NuGetFeed packageFeed, string searchTerm = null,
                                      bool includePrereleases = false, int maxPackages = 128,
                                      string packagesFolder   = null, Action <TypeFinderCriteriaBuilder> configureFinder = null, Dictionary <string, TypeFinderCriteria> criterias = null,
                                      NugetFeedPluginCatalogOptions options = null)
        {
            _packageFeed        = packageFeed;
            _searchTerm         = searchTerm;
            _includePrereleases = includePrereleases;
            _maxPackages        = maxPackages;

            PackagesFolder = packagesFolder ?? Path.Combine(Path.GetTempPath(), "NugetFeedPluginCatalog", Path.GetRandomFileName());

            if (!Directory.Exists(PackagesFolder))
            {
                Directory.CreateDirectory(PackagesFolder);
            }

            if (criterias == null)
            {
                criterias = new Dictionary <string, TypeFinderCriteria>();
            }

            _options = options ?? new NugetFeedPluginCatalogOptions();

            if (configureFinder != null)
            {
                var builder = new TypeFinderCriteriaBuilder();
                configureFinder(builder);

                var criteria = builder.Build();

                _options.TypeFinderOptions.TypeFinderCriterias.Add(criteria);
            }

            foreach (var finderCriteria in criterias)
            {
                finderCriteria.Value.Tags = new List <string>()
                {
                    finderCriteria.Key
                };

                _options.TypeFinderOptions.TypeFinderCriterias.Add(finderCriteria.Value);
            }
        }
Ejemplo n.º 13
0
        public async Task CanTagTypePlugin()
        {
            var catalog = new TypePluginCatalog(typeof(TypePlugin),
                                                new TypePluginCatalogOptions()
            {
                TypeFinderOptions = new TypeFinderOptions()
                {
                    TypeFinderCriterias = new List <TypeFinderCriteria>()
                    {
                        TypeFinderCriteriaBuilder.Create().Tag("MyTag_1"),
                        TypeFinderCriteriaBuilder.Create().Tag("AnotherTag")
                    }
                }
            });

            await catalog.Initialize();

            var plugin = catalog.Single();

            Assert.Equal("MyTag_1", plugin.Tag);
        }
Ejemplo n.º 14
0
 public DefaultOptions()
 {
     TypeFinderOptions.Defaults.TypeFinderCriterias.Add(TypeFinderCriteriaBuilder.Create().Tag("CustomTag"));
     TypeFinderOptions.Defaults.TypeFinderCriterias.Add(TypeFinderCriteriaBuilder.Create().HasName(nameof(TypePlugin)).Tag("MyTag_1"));
     TypeFinderOptions.Defaults.TypeFinderCriterias.Add(TypeFinderCriteriaBuilder.Create().HasName("*Json*").Tag("MyTag_1"));
 }