using Autofac; using GreenTree.Nachtragsmanagement.Core; using GreenTree.Nachtragsmanagement.Core.Plugins; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace GreenTree.Nachtragsmanagement.Services.Misc { public class NotificationService : INotificationService { /// /// Loads all implementations of the INotificationPlugin /// public IEnumerable LoadNotificationPlugins() { var type = typeof(INotificationPlugin); var assemblies = AppDomain.CurrentDomain.GetAssemblies(); var types = assemblies .SelectMany(p => p.GetTypes()) .Where(p => type.IsAssignableFrom(p) && !p.IsInterface) .Select(p => Activator.CreateInstance(p)) .OfType() .ToList(); return types; } /// /// Searches for all implementations of the INotificationPlugin /// public IEnumerable GetNotificationPlugins() { var notificationPlugins = Singleton.Instance.Resolve>(); if (notificationPlugins != null) return notificationPlugins; return LoadNotificationPlugins(); } /// /// Gets a notification plugin by a specific name /// /// SystemName of notification plugin. public INotificationPlugin GetNotificationPlugin(string pluginSystemName) { if (String.IsNullOrEmpty(pluginSystemName)) return null; var notificationPlugin = Singleton.Instance.ResolveNamed(pluginSystemName); if (notificationPlugin != null) return notificationPlugin; var notificationPlugins = GetNotificationPlugins(); if (notificationPlugins == null) return null; return notificationPlugins .FirstOrDefault(p => p.SystemName == pluginSystemName); } } }