public static PluginDefinitions <TPlugin, TContext> Create( Action <PluginDefinitions <TPlugin, TContext> > config = null) { var plugins = new PluginDefinitions <TPlugin, TContext>(); config?.Invoke(plugins); return(plugins); }
public static IEnumerable <TPlugin> ThatApplyTo <TPlugin, TContext>( this PluginDefinitions <TPlugin, TContext> definitions, IEnumerable <TPlugin> plugins, TContext context) where TPlugin : IConditional <TContext> { return(plugins .Where(x => x != null) .GroupJoin(definitions, d => d.GetType(), p => p.Type, (p, d) => new { Instance = p, Order = definitions.Order(p), d.FirstOrDefault()?.AppliesTo }) .Where(x => (x.AppliesTo?.Invoke(context) ?? true) && x.Instance.AppliesTo(context)) .OrderBy(x => x.Order) .Select(x => x.Instance).ToList()); }
public ReplaceDsl(PluginDefinitions <TPlugin, TContext> plugins) { _plugins = plugins; }
public static void RegisterPlugins <TPlugin, TContext>(this IContainer container, PluginDefinitions <TPlugin, TContext> pluginDefinitions) where TPlugin : class, IConditional <TContext> { pluginDefinitions.ForEach(pd => container.Register <TPlugin>(pd.Type, pd.Singleton)); }