예제 #1
0
 internal static IDownlinkBuilder AddLocalPlugins(this IDownlinkBuilder builder, bool forceEnable = false)
 {
     if (forceEnable)
     {
         try
         {
             var scanner = new PluginScanner();
             var root    = new DirectoryInfo(Directory.GetCurrentDirectory());
             var dlls    = root.GetFiles("Downlink.Extensions.*.dll").ToList();
             if (Directory.Exists("Downlink.Extensions"))
             {
                 var extDir = new DirectoryInfo(Path.Combine(root.FullName, "Downlink.Extensions"));
                 dlls.AddRange(extDir.GetFiles("Downlink.Extensions.*.dll", SearchOption.AllDirectories));
             }
             var assemblies = dlls.Select(f => Assembly.LoadFile(f.FullName));
             var modules    = scanner.LoadModulesFromAssemblies(assemblies);
             foreach (var plugin in modules)
             {
                 builder.AddPlugin(plugin);
             }
         }
         catch (System.Exception)
         {
             // ignored
         }
     }
     return(builder);
 }
예제 #2
0
        public void AddServices(IDownlinkBuilder builder)
        {
            var provider = builder.Services.BuildServiceProvider();
            var opts     = provider?.GetService <DownlinkBuilderDefaults>()
                           ?? new DownlinkBuilderDefaults(DownlinkBuilderOptions.None);
            var logger = provider?.GetService <ILogger <DownlinkDefaultServices> >();

            if (opts.RegisterDefaultHandlers)
            {
                logger?.LogDebug("Registering default handlers");
                builder.Services.AddSingleton <ProxyingResponseHandler>();
                builder.Services.AddSingleton <RedirectingResponseHandler>();
                builder.Services.AddSingleton <IResponseHandler>(ServiceFactory.GetResponseHandler);
            }
            if (opts.RegisterDefaultPatterns)
            {
                logger?.LogDebug("Registering default pattern matchers");
                builder.Services.AddDefaultPatternMatchers();
            }
            if (opts.RegisterDefaultSchemeClients)
            {
                logger?.LogDebug("Registering default scheme clients");
                builder.Services.AddTransient <ISchemeClient, HttpDownloadClient>();
                builder.Services.AddTransient <ISchemeClient, FileSchemeClient>();
            }
            if (opts.RegisterDefaultStorage)
            {
                logger?.LogDebug("Registering default storage backends");
                builder.Services.AddGitHubReleaseStorage();
                builder.Services.AddS3Storage();
                builder.Services.AddAzureStorage();
                builder.Services.AddLocalStorage();
            }
            builder.Services.AddFallbackStorage();
        }
예제 #3
0
 public void AddServices(IDownlinkBuilder builder)
 {
     if (_config.GetValue("Experimental:InjectContext", false))
     {
         builder.Services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>();
     }
 }
예제 #4
0
 public static IDownlinkBuilder UseRouteBuilder(this IDownlinkBuilder builder, Type builderType)
 {
     if (builderType.IsAssignableTo <IRoutePrefixBuilder>())
     {
         builder.Services.AddSingleton(typeof(IRoutePrefixBuilder), builderType);
     }
     return(builder);
 }
예제 #5
0
 public static IDownlinkBuilder AddPlugin(this IDownlinkBuilder builder, params Type[] pluginType)
 {
     foreach (var type in pluginType)
     {
         builder.Services.AddSingleton(typeof(Composition.IDownlinkPlugin), type);
     }
     return(builder);
 }
예제 #6
0
 public void AddServices(IDownlinkBuilder builder)
 {
     if (!builder.Services.Any(s => s.ServiceType == typeof(IRoutePrefixBuilder)))
     {
         _logger?.LogInformation("No route provider found, falling back to configuration!");
         // such a hack job
         builder.Services.AddSingleton <IRoutePrefixBuilder, ConfigurationRoutePrefixBuilder>();
     }
     if (!builder.Services.Any(s => s.ServiceType == typeof(IDownlinkRouteConvention)))
     {
         _logger?.LogDebug("No route convention provider found, falling back to default");
         builder.Services.AddSingleton <IDownlinkRouteConvention, DownlinkRouteConvention>();
     }
     builder.Services.Configure <MvcOptions>(opts => opts.Conventions.Add(builder.Services.BuildServiceProvider().GetService <IDownlinkRouteConvention>()));
 }
예제 #7
0
        public void LoadPlugins(IDownlinkBuilder builder, IServiceProvider provider)
        {
            var plugins = provider.GetServices <IDownlinkPlugin>();

            _logger.LogDebug("Resolved {0} plugins from provider.", plugins.Count());
            foreach (var plugin in plugins)
            {
                var name = plugin.GetType().Name;
                try
                {
                    _logger.LogDebug($"Registering '{name}' plugin");
                    plugin.AddServices(builder);
                    _logger.LogInformation($"Successfully loaded '{name}' plugin!");
                }
                catch (Exception ex)
                {
                    _logger.LogWarning($"Plugin {name} failed to register!");
                    _logger.LogError(500, ex, ex.Message);
                }
            }
        }
예제 #8
0
 public static IDownlinkBuilder AddPlugin <T>(this IDownlinkBuilder builder) where T : class, Composition.IDownlinkPlugin
 {
     builder.Services.AddSingleton <Composition.IDownlinkPlugin, T>();
     return(builder);
 }
예제 #9
0
 public static IDownlinkBuilder AddPatternMatcher <T>(this IDownlinkBuilder builder) where T : class, IPatternMatcher
 {
     builder.Services.AddTransient <IPatternMatcher, T>();
     return(builder);
 }
예제 #10
0
        internal static IDownlinkBuilder AddLocalPlugins(this IDownlinkBuilder builder, IConfiguration config)
        {
            var enable = config.GetValue("Experimental:EnableLocalPlugins", false);

            return(builder.AddLocalPlugins(enable));
        }
예제 #11
0
 public static IDownlinkBuilder AddStorage <T>(this IDownlinkBuilder builder) where T : class, IRemoteStorage
 {
     builder.Services.AddSingleton <IRemoteStorage, T>();
     return(builder);
 }
예제 #12
0
 public static IDownlinkBuilder AddResponseHandler <T>(this IDownlinkBuilder builder) where T : class, IResponseHandler
 {
     builder.Services.AddSingleton <IResponseHandler, T>();
     return(builder);
 }
예제 #13
0
 public static IDownlinkBuilder UseRouteBuilder <T>(this IDownlinkBuilder builder) where T : class, Infrastructure.IRoutePrefixBuilder
 {
     builder.Services.AddSingleton <IRoutePrefixBuilder, T>();
     return(builder);
 }
예제 #14
0
 public static IDownlinkBuilder UseRoutePrefix(this IDownlinkBuilder builder, string prefix)
 {
     builder.Services.AddSingleton <IRoutePrefixBuilder>(provider => new StaticRoutePrefixBuilder(prefix));
     return(builder);
 }
예제 #15
0
 public static IDownlinkBuilder AddSchemeClient <T>(this IDownlinkBuilder builder) where T : class, ISchemeClient
 {
     builder.Services.AddTransient <ISchemeClient, T>();
     return(builder);
 }
예제 #16
0
 public static IDownlinkBuilder AddNotificationHandler <T>(this IDownlinkBuilder builder) where T : class, MediatR.INotificationHandler <AppVersionResponseModel>
 {
     builder.Services.AddScoped <MediatR.INotificationHandler <AppVersionResponseModel>, T>();
     return(builder);
 }
예제 #17
0
 public static IDownlinkBuilder AddResponseAction(this IDownlinkBuilder builder, Action <AppVersionResponseModel> response)
 {
     builder.Services.AddTransient <MediatR.INotificationHandler <AppVersionResponseModel> >(provider => new Messaging.ActionNotification(response));
     return(builder);
 }