コード例 #1
0
ファイル: PluginInitializer.cs プロジェクト: giepske/AppDash
        private void InitializePluginTiles(string pluginKey)
        {
            var pluginTileInstances = _pluginResolver.GetPluginTiles(pluginKey);

            foreach (ITile pluginTileInstance in pluginTileInstances)
            {
                var setDependenciesMethod = pluginTileInstance.GetType().GetMethod("SetDependencies");

                if (setDependenciesMethod != null)
                {
                    object?[]? dependencies = setDependenciesMethod.GetParameters()
                                              .Select(parameter =>
                    {
                        return(_serviceProvider.GetService(parameter.ParameterType));
                    })
                                              .ToArray();

                    setDependenciesMethod.Invoke(pluginTileInstance, dependencies);
                }

                var pluginSettingsProperty = pluginTileInstance.GetType().GetProperty("PluginSettings");

                pluginSettingsProperty?.SetValue(pluginTileInstance, _pluginSettingsManager.GetPluginSettings(pluginKey));

                pluginTileInstance.OnAfterLoad().Wait();

                pluginTileInstance.OnAfterLoadInternal().Wait();
            }
        }
コード例 #2
0
ファイル: PluginLoaderTests.cs プロジェクト: giepske/AppDash
        public void LoadPluginsTest()
        {
            //Arrange
            var serviceCollection = new ServiceCollection();

            serviceCollection.AddScoped <IRepository <Plugin>, Repository <Plugin> >(e => _pluginRepositoryMock.Object);
            serviceCollection.AddScoped <IRepository <Tile>, Repository <Tile> >(e => _tileRepositoryMock.Object);
            serviceCollection.AddScoped <DbContext, AppDashTestContext>();

            _pluginRepositoryMock.SetupRepositoryMock(options =>
                                                      { });

            _tileRepositoryMock.SetupRepositoryMock(options =>
                                                    { });

            var pluginResolver = new PluginResolver();

            PluginLoader pluginLoader = new PluginLoader(pluginResolver, serviceCollection.BuildServiceProvider());

            //Act
            pluginLoader.LoadPlugins(Path.Combine(Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath), "plugins"));

            //Assert
            //we expect 1 plugin
            Assert.Single(pluginResolver.GetPlugins());
            //the plugin has 5 tiles
            Assert.Equal(5, pluginResolver.GetPluginTiles().Count());
            //4 of them are type TestTile2
            Assert.Equal(4, pluginResolver.GetPluginTiles().Count(tile => tile.GetType().FullName == typeof(TestTile2).FullName));

            foreach (ITile pluginTile in pluginResolver.GetPluginTiles())
            {
                Assert.NotEmpty(pluginTile.TileKey);
                Assert.NotEmpty(pluginTile.PluginKey);
            }
        }
コード例 #3
0
        public void GetPluginTilesTest()
        {
            //Arrange
            PluginResolver pluginResolver = new PluginResolver();

            pluginResolver.AddPlugin(typeof(TestPlugin.TestPlugin), "TestKey");
            pluginResolver.LoadPluginTile(typeof(TestPlugin.TestPlugin), typeof(TestTile), "TestTileKey");
            pluginResolver.LoadPluginTile(typeof(TestPlugin.TestPlugin), typeof(TestTile2), "TestTile2Key");

            //Act
            var tiles = pluginResolver.GetPluginTiles("TestKey").ToList();

            //Assert
            Assert.Equal(2, tiles.Count);
            Assert.Equal(1, tiles.Count(tile => tile.TileKey == "TestTileKey"));
            Assert.Equal(1, tiles.Count(tile => tile.TileKey == "TestTile2Key"));

            //make sure the tiles are not null
            Assert.NotNull(tiles.First(tile => tile.TileKey == "TestTileKey"));
            Assert.NotNull(tiles.First(tile => tile.TileKey == "TestTileKey"));
        }
コード例 #4
0
ファイル: PluginManager.cs プロジェクト: giepske/AppDash
 public IEnumerable <ITile> GetTiles()
 {
     return(_pluginResolver.GetPluginTiles());
 }
コード例 #5
0
        public void InitializePluginsTest()
        {
            //Arrange
            AppDashTestContext dbContext = new AppDashTestContext();

            var serviceCollection = new ServiceCollection();

            serviceCollection.AddSingleton <IRepository <Plugin>, Repository <Plugin> >(e => _pluginRepositoryMock.Object);
            serviceCollection.AddSingleton <IRepository <Tile>, Repository <Tile> >(e => _tileRepositoryMock.Object);
            serviceCollection.AddSingleton <IRepository <PluginSettings>, Repository <PluginSettings> >(e => _pluginSettingsRepositoryMock.Object);
            serviceCollection.AddSingleton <DbContext, AppDashTestContext>(e => dbContext);

            _pluginRepositoryMock.SetupRepositoryMock(dbContext, options =>
            {
                options.InsertNoTracking(new Plugin
                {
                    UniqueIdentifier = typeof(TestPlugin.TestPlugin).FullName,
                    Key  = "TestKey",
                    Name = "TestName"
                });
            });

            _tileRepositoryMock.SetupRepositoryMock(dbContext, options =>
                                                    { });

            _pluginSettingsRepositoryMock.SetupRepositoryMock(dbContext, options =>
            {
                options.InsertNoTracking(new PluginSettings
                {
                    PluginKey = "TestKey",
                    Data      = JsonConvert.SerializeObject(new PluginData
                    {
                        Data = new Dictionary <string, Tuple <Type, object> >(new List <KeyValuePair <string, Tuple <Type, object> > >
                        {
                            new KeyValuePair <string, Tuple <Type, object> >("TestData", new Tuple <Type, object>(typeof(string), "TestValue")),
                            new KeyValuePair <string, Tuple <Type, object> >("TestData2", new Tuple <Type, object>(typeof(string), "TestValue2"))
                        })
                    })
                });
            });

            var serviceProvider = serviceCollection.BuildServiceProvider();

            var pluginResolver        = new PluginResolver();
            var pluginSettingsManager = new PluginSettingsManager(serviceProvider);

            PluginLoader pluginLoader = new PluginLoader(pluginResolver, serviceProvider);

            PluginInitializer pluginInitializer = new PluginInitializer(pluginResolver, pluginSettingsManager, serviceProvider);

            //Act
            pluginLoader.LoadPlugins(Path.Combine(Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath), "plugins"));

            pluginInitializer.InitializePlugins();

            //Assert
            var plugin = pluginResolver.GetPlugin("TestKey");

            //make sure the plugin exists
            Assert.NotNull(plugin);
            //make sure the plugin has the right key
            Assert.Equal("TestKey", plugin.PluginInstance.Key);
            Assert.Equal("TestKey", plugin.PluginKey);

            foreach (ITile pluginTile in pluginResolver.GetPluginTiles())
            {
                //make sure tiles have correct data
                Assert.Equal("TestKey", pluginTile.PluginKey);
                Assert.NotEmpty(pluginTile.TileKey);
                Assert.NotNull(pluginTile.PluginSettings);
                Assert.NotNull(pluginTile.PluginSettings.GetData <string>("TestData"));
                Assert.NotNull(pluginTile.PluginSettings.GetData <string>("TestData2"));
                Assert.Throws <InvalidCastException>(() =>
                {
                    //make sure this throws an InvalidCastException since it should be a string
                    int data = pluginTile.PluginSettings.GetData <int>("TestData");
                });
            }
        }