using System; using System.Threading; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using MongoDB.Driver; namespace DotNetCore.CAP.MongoDB.Test { public abstract class DatabaseTestHost : IDisposable { private string _connectionString; protected IServiceProvider Provider { get; private set; } protected IMongoClient MongoClient => Provider.GetService(); protected IMongoDatabase Database => MongoClient.GetDatabase(MongoDBOptions.Value.DatabaseName); protected CapOptions CapOptions => Provider.GetService>().Value; protected IOptions MongoDBOptions => Provider.GetService>(); protected DatabaseTestHost() { CreateServiceCollection(); CreateDatabase(); } private void CreateDatabase() { Provider.GetService().InitializeAsync(CancellationToken.None).GetAwaiter().GetResult(); } protected virtual void AddService(ServiceCollection serviceCollection) { } private void CreateServiceCollection() { var services = new ServiceCollection(); services.AddOptions(); services.AddLogging(); _connectionString = ConnectionUtil.ConnectionString; services.AddOptions(); services.Configure(x => x.DatabaseConnection = _connectionString); services.AddSingleton(x => new MongoClient(_connectionString)); services.AddSingleton(); AddService(services); Provider = services.BuildServiceProvider(); } public void Dispose() { MongoClient.DropDatabase(MongoDBOptions.Value.DatabaseName); } } }