コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
ファイル: Program.cs プロジェクト: yucadag/PluginFramework
        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();
                }
            }
        }
コード例 #5
0
            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);
                }
            }
コード例 #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;
        }
コード例 #7
0
        public async Task CanInitialize()
        {
            var catalog = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\netstandard2.0\TestAssembly1.dll");
            await catalog.Initialize();

            var allPlugins = catalog.GetPlugins();

            Assert.NotEmpty(allPlugins);
        }
コード例 #8
0
            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();
            }
コード例 #9
0
        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);
        }
コード例 #10
0
        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);
        }
コード例 #11
0
        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();
        }
コード例 #12
0
        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());
        }
コード例 #13
0
            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);
                }
            }
コード例 #14
0
        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);
        }
コード例 #15
0
        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;
        }
コード例 #16
0
        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);
        }
コード例 #17
0
        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);
            }
        }
コード例 #18
0
        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);
            }
        }
コード例 #19
0
ファイル: Form1.cs プロジェクト: himel951/PluginFramework
        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);
            }
        }
コード例 #20
0
ファイル: Program.cs プロジェクト: yucadag/PluginFramework
        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();
            }
        }
コード例 #21
0
            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();
            }
コード例 #22
0
        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);
            }
        }
コード例 #23
0
        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;
        }
コード例 #24
0
        public async Task ThrowsIfAssemblyNotFound()
        {
            var catalog = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\netstandard2.0\notexists.dll");

            await Assert.ThrowsAsync <ArgumentException>(async() => await catalog.Initialize());
        }