/// <summary> /// Creates instance of <see cref="IFileFsClient"/>. /// </summary> /// <param name="fileFsStoragePath">Path to FileFS storage file.</param> /// <param name="options">Options for FileFS client.</param> /// <param name="logger">Logger instance.</param> /// <returns>Instance of <see cref="IFileFsClient"/>.</returns> public static IFileFsClient Create(string fileFsStoragePath, FileFsClientOptions options, ILogger logger) { ITransactionWrapper CreateTransactionWrapper(bool enableTransactions) => enableTransactions ? (ITransactionWrapper) new TransactionWrapper(fileFsStoragePath, logger) : (ITransactionWrapper) new NullTransactionWrapper(); FileFsClientOptionsValidator.Validate(options); var storageStreamProvider = new StorageStreamProvider(fileFsStoragePath, logger); var connection = new StorageConnection(storageStreamProvider, options.ByteBufferSize, logger); var filesystemDescriptorSerializer = new FilesystemDescriptorSerializer(logger); var filesystemDescriptorAccessor = new FilesystemDescriptorAccessor(connection, filesystemDescriptorSerializer, logger); var entryDescriptorSerializer = new EntryDescriptorSerializer(filesystemDescriptorAccessor, logger); var entryDescriptorRepository = new EntryDescriptorRepository(connection, filesystemDescriptorAccessor, entryDescriptorSerializer, logger); var operationLocker = new StorageOperationLocker(); var optimizer = new StorageOptimizer(connection, entryDescriptorRepository, filesystemDescriptorAccessor, operationLocker, logger); var extender = new StorageExtender(connection, filesystemDescriptorAccessor, operationLocker, logger); var allocator = new FileAllocator(connection, filesystemDescriptorAccessor, entryDescriptorRepository, optimizer, extender, operationLocker, logger); var entryRepository = new EntryRepository(filesystemDescriptorAccessor, entryDescriptorRepository, logger); var fileRepository = new FileRepository(connection, allocator, filesystemDescriptorAccessor, entryDescriptorRepository, logger); var directoryRepository = new DirectoryRepository(filesystemDescriptorAccessor, entryDescriptorRepository, logger); var externalFileManager = new ExternalFileManager(logger); var transactionWrapper = CreateTransactionWrapper(options.EnableTransactions); var client = new FileFsClient(fileRepository, directoryRepository, entryRepository, externalFileManager, optimizer, transactionWrapper, operationLocker); return(client); }
/// <summary> /// Adds FileFS <see cref="IFileFsClient"/> implementation and all its dependencies to IoC container. /// </summary> /// <param name="services">Instance of <see cref="IServiceCollection"/>.</param> /// <param name="fileFsStoragePath">Path to a existing file that is used as FileFS storage.</param> /// <param name="options">Client options.</param> /// <returns>Configured instance of <see cref="IServiceCollection"/>.</returns> public static IServiceCollection AddFileFsClient(this IServiceCollection services, string fileFsStoragePath, FileFsClientOptions options) { FileFsClientOptionsValidator.Validate(options); services.AddSingleton <IStorageStreamProvider, StorageStreamProvider>(provider => new StorageStreamProvider(fileFsStoragePath, provider.GetService <ILogger>())); services.AddSingleton <IStorageConnection, StorageConnection>(provider => new StorageConnection( provider.GetRequiredService <IStorageStreamProvider>(), options.ByteBufferSize, provider.GetRequiredService <ILogger>())); services.AddSingleton <ISerializer <FilesystemDescriptor>, FilesystemDescriptorSerializer>(); services.AddSingleton <IFilesystemDescriptorAccessor, FilesystemDescriptorAccessor>(); services.AddSingleton <ISerializer <EntryDescriptor>, EntryDescriptorSerializer>(); services.AddSingleton <IEntryDescriptorRepository, EntryDescriptorRepository>(); services.AddSingleton <IStorageOptimizer, StorageOptimizer>(); services.AddSingleton <IStorageExtender, StorageExtender>(); services.AddSingleton <IStorageOperationLocker, StorageOperationLocker>(); services.AddSingleton <IFileAllocator, FileAllocator>(); services.AddSingleton <IStorageInitializer, StorageInitializer>(); services.AddSingleton <IEntryRepository, EntryRepository>(); services.AddSingleton <IFileRepository, FileRepository>(); services.AddSingleton <IDirectoryRepository, DirectoryRepository>(); services.AddSingleton <IExternalFileManager, ExternalFileManager>(); if (options.EnableTransactions) { services.AddSingleton <ITransactionWrapper>(provider => new TransactionWrapper(fileFsStoragePath, provider.GetService <ILogger>())); } else { services.AddSingleton <ITransactionWrapper>(new NullTransactionWrapper()); } services.AddSingleton <IFileFsClient, FileFsClient>(); return(services); }