public override void ConfigureServices(IServiceCollection services) { services.Configure <MediaBlobStorageOptions>(_configuration.GetSection("OrchardCore.Media.Azure")); // Only replace default implementation if options are valid. var connectionString = _configuration[$"OrchardCore.Media.Azure:{nameof(MediaBlobStorageOptions.ConnectionString)}"]; var containerName = _configuration[$"OrchardCore.Media.Azure:{nameof(MediaBlobStorageOptions.ContainerName)}"]; if (MediaBlobStorageOptionsCheckFilter.CheckOptions(connectionString, containerName, _logger)) { services.Replace(ServiceDescriptor.Singleton <IMediaFileStore>(serviceProvider => { var options = serviceProvider.GetRequiredService <IOptions <MediaBlobStorageOptions> >().Value; var clock = serviceProvider.GetRequiredService <IClock>(); var contentTypeProvider = serviceProvider.GetRequiredService <IContentTypeProvider>(); var fileStore = new BlobFileStore(options, clock, contentTypeProvider); var mediaBaseUri = fileStore.BaseUri; if (!String.IsNullOrEmpty(options.PublicHostName)) { mediaBaseUri = new UriBuilder(mediaBaseUri) { Host = options.PublicHostName } } .Uri; return(new MediaFileStore(fileStore, mediaBaseUri.ToString())); }));
public async Task InitializeAsync() { IOptionsMonitor <BlobContainerConfiguration> optionsMonitor = Substitute.For <IOptionsMonitor <BlobContainerConfiguration> >(); optionsMonitor.Get(BlobConstants.ContainerConfigurationName).Returns(_blobContainerConfiguration); optionsMonitor.Get(MetadataConstants.ContainerConfigurationName).Returns(_metadataContainerConfiguration); IBlobClientTestProvider testProvider = new BlobClientReadWriteTestProvider(RecyclableMemoryStreamManager); var blobClientInitializer = new BlobClientInitializer(testProvider, NullLogger <BlobClientInitializer> .Instance); _blobClient = blobClientInitializer.CreateBlobClient(_blobDataStoreConfiguration); var blobContainerInitializer = new BlobContainerInitializer(_blobContainerConfiguration.ContainerName, NullLogger <BlobContainerInitializer> .Instance); var metadataContainerInitializer = new BlobContainerInitializer(_metadataContainerConfiguration.ContainerName, NullLogger <BlobContainerInitializer> .Instance); await blobClientInitializer.InitializeDataStoreAsync( _blobClient, _blobDataStoreConfiguration, new List <IBlobContainerInitializer> { blobContainerInitializer, metadataContainerInitializer }); var jsonSerializer = new JsonSerializer(); jsonSerializer.Converters.Add(new JsonDicomConverter()); FileStore = new BlobFileStore(_blobClient, optionsMonitor, RecyclableMemoryStreamManager, Substitute.For <BlobDataStoreConfiguration>()); MetadataStore = new BlobMetadataStore(_blobClient, jsonSerializer, optionsMonitor, RecyclableMemoryStreamManager); }
/// <summary> /// Host services to load site and shell settings from Azure Blob Storage. /// </summary> public static OrchardCoreBuilder AddAzureShellsConfiguration(this OrchardCoreBuilder builder) { var services = builder.ApplicationServices; services.TryAddSingleton <IContentTypeProvider, FileExtensionContentTypeProvider>(); services.AddSingleton <IShellsFileStore>(sp => { var configuration = sp.GetRequiredService <IConfiguration>(); var blobOptions = configuration.GetSectionCompat("OrchardCore:OrchardCore_Shells_Azure").Get <BlobShellStorageOptions>(); if (blobOptions == null) { throw new ArgumentNullException(nameof(BlobShellStorageOptions), "The 'OrchardCore.Shells.Azure' configuration section must be defined"); } var clock = sp.GetRequiredService <IClock>(); var contentTypeProvider = sp.GetRequiredService <IContentTypeProvider>(); var fileStore = new BlobFileStore(blobOptions, clock, contentTypeProvider); return(new BlobShellsFileStore(fileStore)); }); services.Replace(ServiceDescriptor.Singleton <IShellsSettingsSources>(sp => { var shellsFileStore = sp.GetRequiredService <IShellsFileStore>(); var configuration = sp.GetRequiredService <IConfiguration>(); var blobOptions = configuration.GetSectionCompat("OrchardCore:OrchardCore_Shells_Azure").Get <BlobShellStorageOptions>(); var shellOptions = sp.GetRequiredService <IOptions <ShellOptions> >(); return(new BlobShellsSettingsSources(shellsFileStore, blobOptions, shellOptions)); })); services.Replace(ServiceDescriptor.Singleton <IShellConfigurationSources>(sp => { var shellsFileStore = sp.GetRequiredService <IShellsFileStore>(); var configuration = sp.GetRequiredService <IConfiguration>(); var blobOptions = configuration.GetSectionCompat("OrchardCore:OrchardCore_Shells_Azure").Get <BlobShellStorageOptions>(); var shellOptions = sp.GetRequiredService <IOptions <ShellOptions> >(); return(new BlobShellConfigurationSources(shellsFileStore, blobOptions, shellOptions)); })); services.Replace(ServiceDescriptor.Singleton <IShellsConfigurationSources>(sp => { var shellsFileStore = sp.GetRequiredService <IShellsFileStore>(); var environment = sp.GetRequiredService <IHostEnvironment>(); var configuration = sp.GetRequiredService <IConfiguration>(); var blobOptions = configuration.GetSectionCompat("OrchardCore:OrchardCore_Shells_Azure").Get <BlobShellStorageOptions>(); var shellOptions = sp.GetRequiredService <IOptions <ShellOptions> >(); return(new BlobShellsConfigurationSources(shellsFileStore, environment, blobOptions, shellOptions)); })); return(builder); }
public async Task InitializeAsync() { IOptionsMonitor <BlobContainerConfiguration> optionsMonitor = Substitute.For <IOptionsMonitor <BlobContainerConfiguration> >(); optionsMonitor.Get(Constants.BlobContainerConfigurationName).Returns(_blobContainerConfiguration); optionsMonitor.Get(Constants.MetadataContainerConfigurationName).Returns(_metadataContainerConfiguration); IBlobClientTestProvider testProvider = new BlobClientReadWriteTestProvider(RecyclableMemoryStreamManager, NullLogger <BlobClientReadWriteTestProvider> .Instance); _blobClient = BlobClientFactory.Create(_blobDataStoreConfiguration); var blobClientInitializer = new BlobInitializer(_blobClient, testProvider, NullLogger <BlobInitializer> .Instance); var blobContainerInitializer = new BlobContainerInitializer(_blobContainerConfiguration.ContainerName, NullLogger <BlobContainerInitializer> .Instance); var metadataContainerInitializer = new BlobContainerInitializer(_metadataContainerConfiguration.ContainerName, NullLogger <BlobContainerInitializer> .Instance); await blobClientInitializer.InitializeDataStoreAsync( new List <IBlobContainerInitializer> { blobContainerInitializer, metadataContainerInitializer }); FileStore = new BlobFileStore(_blobClient, optionsMonitor, Options.Create(Substitute.For <BlobOperationOptions>())); MetadataStore = new BlobMetadataStore(_blobClient, RecyclableMemoryStreamManager, optionsMonitor, Options.Create(AppSerializerOptions.Json)); }
public override void ConfigureServices(IServiceCollection services) { services.AddTransient <IConfigureOptions <MediaBlobStorageOptions>, MediaBlobStorageOptionsConfiguration>(); // Only replace default implementation if options are valid. var connectionString = _configuration[$"OrchardCore_Media_Azure:{nameof(MediaBlobStorageOptions.ConnectionString)}"]; var containerName = _configuration[$"OrchardCore_Media_Azure:{nameof(MediaBlobStorageOptions.ContainerName)}"]; if (CheckOptions(connectionString, containerName, _logger)) { // Register a media cache file provider. services.AddSingleton <IMediaFileStoreCacheFileProvider>(serviceProvider => { var hostingEnvironment = serviceProvider.GetRequiredService <IWebHostEnvironment>(); if (String.IsNullOrWhiteSpace(hostingEnvironment.WebRootPath)) { throw new Exception("The wwwroot folder for serving cache media files is missing."); } var mediaOptions = serviceProvider.GetRequiredService <IOptions <MediaOptions> >().Value; var shellOptions = serviceProvider.GetRequiredService <IOptions <ShellOptions> >(); var shellSettings = serviceProvider.GetRequiredService <ShellSettings>(); var logger = serviceProvider.GetRequiredService <ILogger <DefaultMediaFileStoreCacheFileProvider> >(); var mediaCachePath = GetMediaCachePath(hostingEnvironment, DefaultMediaFileStoreCacheFileProvider.AssetsCachePath, shellSettings); if (!Directory.Exists(mediaCachePath)) { Directory.CreateDirectory(mediaCachePath); } return(new DefaultMediaFileStoreCacheFileProvider(logger, mediaOptions.AssetsRequestPath, mediaCachePath)); }); // Replace the default media file provider with the media cache file provider. services.Replace(ServiceDescriptor.Singleton <IMediaFileProvider>(serviceProvider => serviceProvider.GetRequiredService <IMediaFileStoreCacheFileProvider>())); // Register the media cache file provider as a file store cache provider. services.AddSingleton <IMediaFileStoreCache>(serviceProvider => serviceProvider.GetRequiredService <IMediaFileStoreCacheFileProvider>()); // Replace the default media file store with a blob file store. services.Replace(ServiceDescriptor.Singleton <IMediaFileStore>(serviceProvider => { var blobStorageOptions = serviceProvider.GetRequiredService <IOptions <MediaBlobStorageOptions> >().Value; var shellOptions = serviceProvider.GetRequiredService <IOptions <ShellOptions> >(); var shellSettings = serviceProvider.GetRequiredService <ShellSettings>(); var mediaOptions = serviceProvider.GetRequiredService <IOptions <MediaOptions> >().Value; var clock = serviceProvider.GetRequiredService <IClock>(); var contentTypeProvider = serviceProvider.GetRequiredService <IContentTypeProvider>(); var mediaEventHandlers = serviceProvider.GetServices <IMediaEventHandler>(); var mediaCreatingEventHandlers = serviceProvider.GetServices <IMediaCreatingEventHandler>(); var logger = serviceProvider.GetRequiredService <ILogger <DefaultMediaFileStore> >(); var fileStore = new BlobFileStore(blobStorageOptions, clock, contentTypeProvider); var mediaPath = GetMediaPath(shellOptions.Value, shellSettings, mediaOptions.AssetsPath); var mediaUrlBase = "/" + fileStore.Combine(shellSettings.RequestUrlPrefix, mediaOptions.AssetsRequestPath); var originalPathBase = serviceProvider.GetRequiredService <IHttpContextAccessor>() .HttpContext?.Features.Get <ShellContextFeature>()?.OriginalPathBase ?? null; if (originalPathBase.HasValue) { mediaUrlBase = fileStore.Combine(originalPathBase.Value, mediaUrlBase); } return(new DefaultMediaFileStore(fileStore, mediaUrlBase, mediaOptions.CdnBaseUrl, mediaEventHandlers, mediaCreatingEventHandlers, logger)); })); services.AddSingleton <IMediaEventHandler, DefaultMediaFileStoreCacheEventHandler>(); services.AddScoped <IModularTenantEvents, CreateMediaBlobContainerEvent>(); } }