public void ConfigureServices(IServiceCollection services)
        {
            Startup.AddIndexerServices(services, Configuration);

            services.Replace(new ServiceDescriptor(typeof(IMapMongoBlockToStorageBlock), typeof(CirrusBlockMapping),
                                                   ServiceLifetime.Transient));

            services.Replace(new ServiceDescriptor(typeof(ICryptoClientFactory), typeof(CirrusClientFactory),
                                                   ServiceLifetime.Singleton));

            ServiceDescriptor descriptor = services.First(_ => _.ImplementationType == typeof(MongoBuilder));

            services.Remove(descriptor);
            services.AddSingleton <TaskStarter, CirrusMongoBuilder>();

            services.Replace(new ServiceDescriptor(typeof(ISyncBlockTransactionOperationBuilder), typeof(CirrusSyncBlockTransactionOperationBuilder),
                                                   ServiceLifetime.Singleton));

            services.Replace(new ServiceDescriptor(typeof(IScriptInterpeter), typeof(CirrusScriptToAddressParser), ServiceLifetime.Singleton));

            services.Replace(new ServiceDescriptor(typeof(IStorageOperations), typeof(CirrusMongoStorageOperations), ServiceLifetime.Singleton));

            services.Replace(new ServiceDescriptor(typeof(IStorage), typeof(CirrusMongoData), ServiceLifetime.Singleton));

            services.AddSingleton <ICirrusStorage, CirrusMongoData>();
            services.AddSingleton <ICirrusMongoDb, CirrusMongoDb>();

            services.AddControllers()
            .AddApplicationPart(typeof(Startup).Assembly)
            .AddControllersAsServices();

            services.AddTransient <IComputeSmartContractService <NonFungibleTokenComputedTable>, NftComputationService>();
            services.AddTransient(typeof(IComputeSmartContractService <>), typeof(ComputeSmartContractService <>));
            services.AddTransient(typeof(ISmartContractHandlersFactory <>), typeof(SmartContractHandlersFactory <>));

            ScanAssemblyAndRegisterTypeByNameAsTransient(services, typeof(ILogReader <DaoContractComputedTable>),
                                                         typeof(ILogReader <>).Assembly);
            ScanAssemblyAndRegisterTypeByNameAsTransient(services, typeof(ILogReader <StandardTokenComputedTable>),
                                                         typeof(ILogReader <>).Assembly);
            ScanAssemblyAndRegisterTypeByNameAsTransient(services, typeof(ILogReader <NonFungibleTokenComputedTable>),
                                                         typeof(ILogReader <>).Assembly);

            RegisterSmartContractBuilder(services); //No need to scan the assembly as there won't be that many
        }