public static ILoggerFactory AddOrchardLogging( [NotNull] this ILoggerFactory loggingFactory, IServiceProvider serviceProvider) { /* TODO (ngm): Abstract this logger stuff outta here! */ var loader = serviceProvider.GetRequiredService<IExtensionLoader>(); var manager = serviceProvider.GetRequiredService<IExtensionManager>(); var descriptor = manager.GetExtension("Orchard.Logging.Console"); var entry = loader.Load(descriptor); var loggingInitiatorTypes = entry .Assembly .ExportedTypes .Where(et => typeof(ILoggingInitiator).IsAssignableFrom(et)); IServiceCollection loggerCollection = new ServiceCollection(); foreach (var initiatorType in loggingInitiatorTypes) { loggerCollection.AddScoped(typeof(ILoggingInitiator), initiatorType); } var moduleServiceProvider = loggerCollection.BuildShellServiceProviderWithHost(serviceProvider); foreach (var service in moduleServiceProvider.GetServices<ILoggingInitiator>()) { service.Initialize(loggingFactory); } return loggingFactory; }
public IServiceProvider CreateContainer(ShellSettings settings, ShellBlueprint blueprint) { IServiceCollection serviceCollection = new ServiceCollection(); serviceCollection.AddInstance(settings); serviceCollection.AddInstance(blueprint.Descriptor); serviceCollection.AddInstance(blueprint); // Sure this is right? serviceCollection.AddInstance(_loggerFactory); IServiceCollection moduleServiceCollection = new ServiceCollection(); foreach (var dependency in blueprint.Dependencies .Where(t => typeof(IModule).IsAssignableFrom(t.Type))) { moduleServiceCollection.AddScoped(typeof(IModule), dependency.Type); } foreach (var service in moduleServiceCollection.BuildServiceProvider().GetServices<IModule>()) { service.Configure(serviceCollection); } foreach (var dependency in blueprint.Dependencies .Where(t => !typeof(IModule).IsAssignableFrom(t.Type))) { foreach (var interfaceType in dependency.Type.GetInterfaces() .Where(itf => typeof(IDependency).IsAssignableFrom(itf))) { _logger.LogDebug("Type: {0}, Interface Type: {1}", dependency.Type, interfaceType); if (typeof(ISingletonDependency).IsAssignableFrom(interfaceType)) { serviceCollection.AddSingleton(interfaceType, dependency.Type); } else if (typeof(IUnitOfWorkDependency).IsAssignableFrom(interfaceType)) { serviceCollection.AddScoped(interfaceType, dependency.Type); } else if (typeof(ITransientDependency).IsAssignableFrom(interfaceType)) { serviceCollection.AddTransient(interfaceType, dependency.Type); } else { serviceCollection.AddScoped(interfaceType, dependency.Type); } } } return serviceCollection.BuildShellServiceProviderWithHost(_serviceProvider); }