示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }