예제 #1
0
        private string InsertPluginKey(Type pluginType)
        {
            using (var scope = _serviceProvider.CreateScope())
            {
                var pluginRepository = scope.ServiceProvider.GetService <IRepository <Core.Domain.Plugins.Plugin> >();

                AppDashPlugin pluginInstance = (AppDashPlugin)Activator.CreateInstance(pluginType);

                var pluginData = new Core.Domain.Plugins.Plugin
                {
                    UniqueIdentifier = pluginType.FullName,
                    Key  = Guid.NewGuid().ToString("N"),
                    Name = pluginInstance.Name
                };

                pluginRepository.Insert(pluginData);

                return(pluginData.Key);
            }
        }
예제 #2
0
        private void LoadPluginTiles(Type pluginType, AppDashPlugin pluginInstance)
        {
            var pluginTileTypes = pluginType.Assembly.GetTypes().Where(type =>
                                                                       (type.BaseType?.BaseType?.IsGenericType ?? false) &&
                                                                       type.BaseType?.BaseType?.GetGenericTypeDefinition() == typeof(PluginTile <,>) &&
                                                                       type.BaseType?.GenericTypeArguments[0] == pluginType &&
                                                                       type.GetCustomAttribute <FactoryTileAttribute>() == null);

            foreach (Type tileType in pluginTileTypes)
            {
                string tileKey = GetTileKey(tileType) ?? InsertTileKey(tileType);

                _pluginResolver.LoadPluginTile(pluginType, tileType, tileKey);
            }

            var tileFactoryTypes = pluginType.Assembly.GetTypes().Where(type =>
                                                                        type.GetInterfaces().FirstOrDefault(i =>
                                                                                                            i.IsGenericType && i.GetGenericTypeDefinition() == typeof(ITileFactory <>))
                                                                        ?.GenericTypeArguments[0] == pluginType);

            foreach (Type tileFactoryType in tileFactoryTypes)
            {
                var tileFactory = Activator.CreateInstance(tileFactoryType);

                var method = tileFactoryType.GetMethod("GetTiles");

                var tiles = ((IEnumerable <ITile>)method.Invoke(tileFactory, new[] { pluginInstance })).ToList();

                for (int i = 0; i < tiles.Count; i++)
                {
                    var tileType = tiles[i].GetType();

                    string tileKey = GetTileKey(tileType, tileFactoryType.FullName, i) ?? InsertTileKey(tileType, tileFactoryType.FullName, i);

                    _pluginResolver.LoadPluginTile(pluginType, tiles[i], tileKey);
                }
            }
        }