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