public async Task CanConfigureDefaultOptions() { // Make sure that the referenced version of JSON.NET is loaded into memory var json = Newtonsoft.Json.JsonConvert.SerializeObject(1); PluginLoadContextOptions.Defaults.UseHostApplicationAssemblies = UseHostApplicationAssembliesEnum.Always; Action <TypeFinderCriteriaBuilder> configureFinder = configure => { configure.HasName("*JsonResolver"); }; var assemblyPluginCatalog = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\JsonNew\netstandard2.0\JsonNetNew.dll", configureFinder); var folderPluginCatalog = new FolderPluginCatalog(@"..\..\..\..\..\Assemblies\bin\JsonOld\netstandard2.0", configureFinder); await assemblyPluginCatalog.Initialize(); await folderPluginCatalog.Initialize(); var newPlugin = assemblyPluginCatalog.Single(); var oldPlugin = folderPluginCatalog.Single(); dynamic newPluginJsonResolver = Activator.CreateInstance(newPlugin); var newPluginVersion = newPluginJsonResolver.GetVersion(); dynamic oldPluginJsonResolver = Activator.CreateInstance(oldPlugin); var oldPluginVersion = oldPluginJsonResolver.GetVersion(); Assert.Equal("12.0.0.0", newPluginVersion); Assert.Equal("12.0.0.0", oldPluginVersion); }
public async Task CanUseHostsDependencies() { // Make sure that the referenced version of JSON.NET is loaded into memory var json = Newtonsoft.Json.JsonConvert.SerializeObject(1); _testOutputHelper.WriteLine(json); var options = new AssemblyPluginCatalogOptions { PluginLoadContextOptions = new PluginLoadContextOptions() { UseHostApplicationAssemblies = UseHostApplicationAssembliesEnum.Always } }; var folder1Catalog = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\JsonNew\netstandard2.0\JsonNetNew.dll", options); await folder1Catalog.Initialize(); var folder2Catalog = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\JsonOld\netstandard2.0\JsonNetOld.dll", options); await folder2Catalog.Initialize(); var newPlugin = folder1Catalog.Single(); var oldPlugin = folder2Catalog.Single(); dynamic newPluginJsonResolver = Activator.CreateInstance(newPlugin); var newPluginVersion = newPluginJsonResolver.GetVersion(); dynamic oldPluginJsonResolver = Activator.CreateInstance(oldPlugin); var oldPluginVersion = oldPluginJsonResolver.GetVersion(); Assert.Equal("12.0.0.0", newPluginVersion); Assert.Equal("12.0.0.0", oldPluginVersion); }
public async Task CanUseSelectedHoststDependencies() { // Make sure that the referenced version of JSON.NET is loaded into memory var json = Newtonsoft.Json.JsonConvert.SerializeObject(1); // Make sure that the referenced version of Microsoft.Extensions.Logging is loaded into memory var logging = new Microsoft.Extensions.Logging.LoggerFactory(); var options = new AssemblyPluginCatalogOptions();; options.PluginLoadContextOptions = new PluginLoadContextOptions() { UseHostApplicationAssemblies = UseHostApplicationAssembliesEnum.Selected, HostApplicationAssemblies = new List <AssemblyName>() { typeof(Microsoft.Extensions.Logging.LoggerFactory).Assembly.GetName() } }; var catalog = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\JsonOld\netstandard2.0\JsonNetOld.dll", options); await catalog.Initialize(); var oldPlugin = catalog.Single(); dynamic oldPluginJsonResolver = Activator.CreateInstance(oldPlugin); var oldPluginVersion = oldPluginJsonResolver.GetVersion(); var loggerVersion = oldPluginJsonResolver.GetLoggingVersion(); Assert.Equal("3.1.2.0", loggerVersion); Assert.Equal("9.0.0.0", oldPluginVersion); }
private static async Task CompositeCatalogSample() { Console.WriteLine("Composite catalog sample"); // 1. Create a new plugin catalog from the current assembly var assemblyPluginCatalog = new AssemblyPluginCatalog(typeof(Program).Assembly, type => typeof(IPlugin).IsAssignableFrom(type)); // 2. Also create a new plugin catalog from a type var typePluginCatalog = new TypePluginCatalog(typeof(MyPlugin)); // 3. Then combine the catalogs into a composite catalog var compositeCatalog = new CompositePluginCatalog(assemblyPluginCatalog, typePluginCatalog); // 4. Initialize the composite catalog await compositeCatalog.Initialize(); // 5. Get the plugins from the catalog var assemplyPlugins = compositeCatalog.GetPlugins(); foreach (var plugin in assemplyPlugins) { if (plugin.Type.Name == "MyPlugin") { var inst = (IMyPlugin)Activator.CreateInstance(plugin); inst.Run(); } else { var inst = (IPlugin)Activator.CreateInstance(plugin); inst.Run(); } } }
public async Task CanOverrideDefaultNamingOptions() { var options = new AssemblyPluginCatalogOptions() { PluginNameOptions = new PluginNameOptions() { PluginNameGenerator = (nameOptions, type) => type.FullName + "Overridden" } }; var catalog = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\netstandard2.0\TestAssembly1.dll"); var catalog2 = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\netstandard2.0\TestAssembly2.dll", options); await catalog.Initialize(); await catalog2.Initialize(); var catalog1Plugins = catalog.GetPlugins(); foreach (var plugin in catalog1Plugins) { Assert.EndsWith("Modified", plugin.Name); } var catalog2Plugins = catalog2.GetPlugins(); foreach (var plugin in catalog2Plugins) { Assert.EndsWith("Overridden", plugin.Name); } }
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 CanInitialize() { var catalog = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\netstandard2.0\TestAssembly1.dll"); await catalog.Initialize(); var allPlugins = catalog.GetPlugins(); Assert.NotEmpty(allPlugins); }
public async Task DefaultTagsWithAssemblyCatalogTypeShouldNotDuplicatePlugins() { var catalog = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\JsonNew\netstandard2.0\JsonNetNew.dll"); await catalog.Initialize(); Assert.Single(catalog.GetPlugins()); var plugin = catalog.Get(); Assert.Equal(2, plugin.Tags.Count); TypeFinderOptions.Defaults.TypeFinderCriterias.Clear(); }
public async Task CanGetPluginsByAttribute() { var catalog = new AssemblyPluginCatalog(typeof(TypeFinderTests).Assembly, configure => { configure.HasAttribute(typeof(MyPluginAttribute)); }); await catalog.Initialize(); Assert.Equal(2, catalog.GetPlugins().Count); }
public async Task ByDefaultOnlyContainsPublicNonAbstractClasses() { var catalog = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\netstandard2.0\TestAssembly1.dll"); await catalog.Initialize(); var allPlugins = catalog.GetPlugins(); var plugin = allPlugins.Single(); Assert.False(plugin.Type.IsAbstract); Assert.False(plugin.Type.IsInterface); }
private async Task CreateCatalogs() { // 1. Uses folder catalog to add calculation operations inside the app. Mimics the WPF-sample. var folderPluginCatalog = new FolderPluginCatalog(@"..\..\..\..\Shared\Weikio.PluginFramework.Samples.SharedPlugins\bin\debug\netcoreapp3.1", type => { type.Implements <IOperator>().Tag("operator"); }); _allPlugins.AddCatalog(folderPluginCatalog); var assemblyPluginCatalog = new AssemblyPluginCatalog(typeof(Form1).Assembly, builder => { builder.Implements <IOperator>() .Tag("operator"); }); _allPlugins.AddCatalog(assemblyPluginCatalog); // 2. Another folder catalog is used to add other forms inside the app. For each form a button is added into the toolstrip // Note: WinFormsPluginsLibrary must be manually built as it isn't referenced by this sample app var folderCatalog = new FolderPluginCatalog(@"..\..\..\..\WinFormsPluginsLibrary\bin\debug\netcoreapp3.1", type => { type.Implements <IDialog>() .Tag("dialog"); }); _allPlugins.AddCatalog(folderCatalog); // 3. Lastly, DelegateCatalog is used for creating an exit-button var exitAction = new Action(() => { var result = MessageBox.Show("This is also a plugin. Do you want to exit this sample app?", "Exit App?", MessageBoxButtons.YesNo); if (result == DialogResult.No) { return; } Application.Exit(); }); var exitCatalog = new DelegatePluginCatalog(exitAction, options: new DelegatePluginCatalogOptions() { Tags = new List <string> { "buttons" } }, pluginName: "Exit"); _allPlugins.AddCatalog(exitCatalog); // Finally the plugin catalog is initialized await _allPlugins.Initialize(); }
public async Task CanGetPluginsByMultipleCriteria() { var catalog = new AssemblyPluginCatalog(typeof(TypeFinderTests).Assembly, configure => { configure.HasAttribute(typeof(MyPluginAttribute)) .IsAbstract(true) .HasName(nameof(AbstractPluginWithAttribute)); }); await catalog.Initialize(); Assert.Single(catalog.GetPlugins()); }
public async Task CanConfigureDefaultNamingOptions() { var catalog = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\netstandard2.0\TestAssembly1.dll"); await catalog.Initialize(); var allPlugins = catalog.GetPlugins(); foreach (var plugin in allPlugins) { Assert.EndsWith("Modified", plugin.Name); } }
public async Task CanInitializeWithCriteria() { var catalog = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\netstandard2.0\TestAssembly1.dll", configure => { configure.HasName("*Plugin"); }); await catalog.Initialize(); var allPlugins = catalog.GetPlugins(); Assert.Single(allPlugins); }
public async Task Initialize() { var converter = new DelegateToAssemblyConverter(); var assembly = converter.CreateAssembly(_multicastDelegate, _options); var options = new AssemblyPluginCatalogOptions() { PluginNameOptions = _options.NameOptions }; _catalog = new AssemblyPluginCatalog(assembly, options); await _catalog.Initialize(); IsInitialized = true; }
public async Task CanIncludeAbstractClassesUsingCriteria() { var catalog = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\netstandard2.0\TestAssembly1.dll", builder => { builder.IsAbstract(true); }); await catalog.Initialize(); var allPlugins = catalog.GetPlugins(); var plugin = allPlugins.Single(); Assert.True(plugin.Type.IsAbstract); }
public async Task CanTagAssemblyPluginUsingBuilder() { var catalog = new AssemblyPluginCatalog(typeof(TypePlugin).Assembly, builder => { builder.AssignableTo(typeof(TypePlugin)) .Tag("operator"); }); await catalog.Initialize(); var allPlugins = catalog.GetPlugins(); foreach (var plugin in allPlugins) { Assert.Equal("operator", plugin.Tag); } }
public async Task CanTagAssemblyPlugin() { var catalog = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\netstandard2.0\TestAssembly1.dll", null, taggedFilters: new Dictionary <string, Predicate <Type> >() { { "CustomTag", type => true } }); await catalog.Initialize(); var allPlugins = catalog.GetPlugins(); foreach (var plugin in allPlugins) { Assert.Equal("CustomTag", plugin.Tag); } }
private async Task AddCalculationOperators() { var folderPluginCatalog = new FolderPluginCatalog(@"..\..\..\..\Shared\Weikio.PluginFramework.Samples.SharedPlugins\bin\debug\netcoreapp3.1", type => { type.Implements <IOperator>(); }); var assemblyPluginCatalog = new AssemblyPluginCatalog(typeof(Form1).Assembly, type => typeof(IOperator).IsAssignableFrom(type)); var pluginCatalog = new CompositePluginCatalog(folderPluginCatalog, assemblyPluginCatalog); await pluginCatalog.Initialize(); var allPlugins = pluginCatalog.GetPlugins(); foreach (var plugin in allPlugins) { listBox1.Items.Add(plugin); } }
private static async Task AssemblyCatalogSample() { Console.WriteLine("Assembly catalog sample"); // 1. Create a new plugin catalog from the current assembly var assemblyPluginCatalog = new AssemblyPluginCatalog(typeof(Program).Assembly, type => typeof(IPlugin).IsAssignableFrom(type)); // 2. Initialize the catalog await assemblyPluginCatalog.Initialize(); // 3. Get the plugins from the catalog var assemplyPlugins = assemblyPluginCatalog.GetPlugins(); foreach (var plugin in assemplyPlugins) { var inst = (IPlugin)Activator.CreateInstance(plugin); inst.Run(); } }
public async Task CanTagUsingDefaultOptions() { var assemblyPluginCatalog = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\netstandard2.0\TestAssembly1.dll"); var typePluginCatalog = new TypePluginCatalog(typeof(TypePlugin)); var compositeCatalog = new CompositePluginCatalog(assemblyPluginCatalog, typePluginCatalog); await compositeCatalog.Initialize(); var customTaggedPlugins = compositeCatalog.GetByTag("CustomTag"); Assert.Equal(2, customTaggedPlugins.Count); var myTaggedPlugins = compositeCatalog.GetByTag("MyTag_1"); Assert.Single(myTaggedPlugins); TypeFinderOptions.Defaults.TypeFinderCriterias.Clear(); }
public async Task CanConfigureNamingOptions() { var options = new AssemblyPluginCatalogOptions() { PluginNameOptions = new PluginNameOptions() { PluginNameGenerator = (nameOptions, type) => type.FullName + "Modified" } }; var catalog = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\netstandard2.0\TestAssembly1.dll", options); await catalog.Initialize(); var allPlugins = catalog.GetPlugins(); foreach (var plugin in allPlugins) { Assert.EndsWith("Modified", plugin.Name); } }
private async void MainWindow_OnLoaded(object sender, RoutedEventArgs e) { var folderPluginCatalog = new FolderPluginCatalog(@"..\..\..\..\Shared\Weikio.PluginFramework.Samples.SharedPlugins\bin\debug\netcoreapp3.1", type => { type.Implements <IOperator>(); }); var assemblyPluginCatalog = new AssemblyPluginCatalog(typeof(MainWindow).Assembly, type => typeof(IOperator).IsAssignableFrom(type)); var pluginCatalog = new CompositePluginCatalog(folderPluginCatalog, assemblyPluginCatalog); await pluginCatalog.Initialize(); var allPlugins = pluginCatalog.GetPlugins(); foreach (var plugin in allPlugins) { _plugins.Add(plugin); } PluginsList.ItemsSource = _plugins; }
public async Task ThrowsIfAssemblyNotFound() { var catalog = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\netstandard2.0\notexists.dll"); await Assert.ThrowsAsync <ArgumentException>(async() => await catalog.Initialize()); }