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); }
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); } }
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); } }
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; }
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); }
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); }
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); } }
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); } }
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); }
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")); }