예제 #1
0
        public TMongoDbContext GetDbContext()
        {
            Logger.LogWarning(
                "UnitOfWorkDbContextProvider.GetDbContext is deprecated. Use GetDbContextAsync instead! " +
                "You are probably using LINQ (LINQ extensions) directly on a repository. In this case, use repository.GetQueryableAsync() method " +
                "to obtain an IQueryable<T> instance and use LINQ (LINQ extensions) on this object. "
                );
            Logger.LogWarning(Environment.StackTrace.Truncate(2048));

            var unitOfWork = _unitOfWorkManager.Current;

            if (unitOfWork == null)
            {
                throw new AbpException(
                          $"A {nameof(IMongoDatabase)} instance can only be created inside a unit of work!");
            }

            var connectionString = _connectionStringResolver.Resolve <TMongoDbContext>();
            var dbContextKey     = $"{typeof(TMongoDbContext).FullName}_{connectionString}";

            var mongoUrl     = new MongoUrl(connectionString);
            var databaseName = mongoUrl.DatabaseName;

            if (databaseName.IsNullOrWhiteSpace())
            {
                databaseName = ConnectionStringNameAttribute.GetConnStringName <TMongoDbContext>();
            }

            //TODO: Create only single MongoDbClient per connection string in an application (extract MongoClientCache for example).
            var databaseApi = unitOfWork.GetOrAddDatabaseApi(
                dbContextKey,
                () => new MongoDbDatabaseApi <TMongoDbContext>(CreateDbContext(unitOfWork, mongoUrl, databaseName)));

            return(((MongoDbDatabaseApi <TMongoDbContext>)databaseApi).DbContext);
        }
예제 #2
0
        public TMongoDbContext GetDbContext()
        {
            var unitOfWork = _unitOfWorkManager.Current;

            if (unitOfWork == null)
            {
                throw new AbpException(
                          $"A {nameof(IMongoDatabase)} instance can only be created inside a unit of work!");
            }

            var connectionString = _connectionStringResolver.Resolve <TMongoDbContext>();
            var dbContextKey     = $"{typeof(TMongoDbContext).FullName}_{connectionString}";

            var mongoUrl     = new MongoUrl(connectionString);
            var databaseName = mongoUrl.DatabaseName;

            if (databaseName.IsNullOrWhiteSpace())
            {
                databaseName = ConnectionStringNameAttribute.GetConnStringName <TMongoDbContext>();
            }

            //TODO: Create only single MongoDbClient per connection string in an application (extract MongoClientCache for example).
            var databaseApi = unitOfWork.GetOrAddDatabaseApi(
                dbContextKey,
                () => new MongoDbDatabaseApi <TMongoDbContext>(CreateDbContext(unitOfWork, mongoUrl, databaseName)));

            return(((MongoDbDatabaseApi <TMongoDbContext>)databaseApi).DbContext);
        }
예제 #3
0
        public IMongoDatabase GetDatabase()
        {
            var unitOfWork = _unitOfWorkManager.Current;

            if (unitOfWork == null)
            {
                throw new AbpException($"A {nameof(IMongoDatabase)} instance can only be created inside a unit of work!");
            }

            var connectionString = _connectionStringResolver.Resolve <TMongoDbContext>();
            var dbContextKey     = $"{typeof(TMongoDbContext).FullName}_{connectionString}";

            string databaseName;

            if (connectionString.Contains("|"))
            {
                var splitted = connectionString.Split('|');
                connectionString = splitted[0];
                databaseName     = splitted[1];
            }
            else
            {
                databaseName = ConnectionStringNameAttribute.GetConnStringName <TMongoDbContext>();
            }

            //TODO: Create only single MongoDbClient per connection string in an application (extract MongoClientCache for example).
            var databaseApi = unitOfWork.GetOrAddDatabaseApi(
                dbContextKey,
                () => new MongoDbDatabaseApi(
                    new MongoClient(connectionString).GetDatabase(databaseName)
                    ));

            return(((MongoDbDatabaseApi)databaseApi).Database);
        }
예제 #4
0
        public async Task <TDbContext> GetDbContextAsync()
        {
            var unitOfWork = _unitOfWorkManager.Current;

            if (unitOfWork == null)
            {
                throw new AbpException("A DbContext can only be created inside a unit of work!");
            }

            var connectionStringName = ConnectionStringNameAttribute.GetConnStringName <TDbContext>();
            var connectionString     = await _connectionStringResolver.ResolveAsync(connectionStringName);

            var dbContextKey = $"{typeof(TDbContext).FullName}_{connectionString}";

            var databaseApi = unitOfWork.FindDatabaseApi(dbContextKey);

            if (databaseApi == null)
            {
                databaseApi = new EfCoreDatabaseApi <TDbContext>(
                    await CreateDbContextAsync(unitOfWork, connectionStringName, connectionString)
                    );

                unitOfWork.AddDatabaseApi(dbContextKey, databaseApi);
            }

            return(((EfCoreDatabaseApi <TDbContext>)databaseApi).DbContext);
        }
예제 #5
0
        public TMongoDbContext GetDbContext()
        {
            var unitOfWork = _unitOfWorkManager.Current;

            if (unitOfWork == null)
            {
                throw new RocketException($"A {nameof(IMongoDatabase)} instance can only be created inside a unit of work!");
            }

            var connectionString = _connectionStringResolver.Resolve <TMongoDbContext> ();
            var dbContextKey     = $"{typeof(TMongoDbContext).FullName}_{connectionString}";

            var mongoUrl     = new MongoUrl(connectionString);
            var databaseName = mongoUrl.DatabaseName;

            if (databaseName.IsNullOrWhiteSpace())
            {
                databaseName = ConnectionStringNameAttribute.GetConnStringName <TMongoDbContext> ();
            }

            //TODO: 考虑创建一个单例的客户端 MongoDbClient (除了作为示例 MongoClientCache).
            var databaseApi = unitOfWork.GetOrAddDatabaseApi(
                dbContextKey,
                () => {
                var database = new MongoClient(mongoUrl).GetDatabase(databaseName);

                var dbContext = unitOfWork.ServiceProvider.GetRequiredService <TMongoDbContext> ();

                dbContext.ToRocketMongoDbContext().InitializeDatabase(database);

                return(new MongoDbDatabaseApi <TMongoDbContext> (dbContext));
            });

            return(((MongoDbDatabaseApi <TMongoDbContext>)databaseApi).DbContext);
        }
예제 #6
0
    public TDbContext GetDbContext()
    {
        if (UnitOfWork.EnableObsoleteDbContextCreationWarning &&
            !UnitOfWorkManager.DisableObsoleteDbContextCreationWarning.Value)
        {
            Logger.LogWarning(
                "UnitOfWorkDbContextProvider.GetDbContext is deprecated. Use GetDbContextAsync instead! " +
                "You are probably using LINQ (LINQ extensions) directly on a repository. In this case, use repository.GetQueryableAsync() method " +
                "to obtain an IQueryable<T> instance and use LINQ (LINQ extensions) on this object. "
                );
            Logger.LogWarning(Environment.StackTrace.Truncate(2048));
        }

        var unitOfWork = _unitOfWorkManager.Current;

        if (unitOfWork == null)
        {
            throw new AbpException("A DbContext can only be created inside a unit of work!");
        }

        var targetDbContextType  = _options.GetReplacedTypeOrSelf(typeof(TDbContext));
        var connectionStringName = ConnectionStringNameAttribute.GetConnStringName(targetDbContextType);
        var connectionString     = ResolveConnectionString(connectionStringName);
        var dbContextKey         = $"{targetDbContextType.FullName}_{connectionString}";

        var databaseApi = unitOfWork.GetOrAddDatabaseApi(
            dbContextKey,
            () => new EfCoreDatabaseApi(
                CreateDbContext(unitOfWork, connectionStringName, connectionString)
                ));

        return((TDbContext)((EfCoreDatabaseApi)databaseApi).DbContext);
    }
예제 #7
0
    public async Task <TDbContext> GetDbContextAsync()
    {
        var unitOfWork = _unitOfWorkManager.Current;

        if (unitOfWork == null)
        {
            throw new AbpException("A DbContext can only be created inside a unit of work!");
        }

        var targetDbContextType  = _options.GetReplacedTypeOrSelf(typeof(TDbContext));
        var connectionStringName = ConnectionStringNameAttribute.GetConnStringName(targetDbContextType);
        var connectionString     = await ResolveConnectionStringAsync(connectionStringName);

        var dbContextKey = $"{targetDbContextType.FullName}_{connectionString}";

        var databaseApi = unitOfWork.FindDatabaseApi(dbContextKey);

        if (databaseApi == null)
        {
            databaseApi = new EfCoreDatabaseApi(
                await CreateDbContextAsync(unitOfWork, connectionStringName, connectionString)
                );

            unitOfWork.AddDatabaseApi(dbContextKey, databaseApi);
        }

        return((TDbContext)((EfCoreDatabaseApi)databaseApi).DbContext);
    }
예제 #8
0
    /// <summary>
    /// 获取数据库上下文
    /// </summary>
    /// <returns></returns>
    /// <exception cref="Exception"></exception>
    public async Task <TDbContext> GetDbContextAsync()
    {
        // 获得当前的可用工作单元。
        var unitOfWork = _unitOfWorkManager.Current;

        if (unitOfWork == null)
        {
            throw new Exception("A DbContext can only be created inside a unit of work!");
        }

        // 获得数据库连接上下文的连接字符串名称。
        // 根据名称解析具体的连接字符串。
        var targetDbContextType  = _options.GetReplacedTypeOrSelf(typeof(TDbContext));
        var connectionStringName = ConnectionStringNameAttribute.GetConnStringName(targetDbContextType);
        var connectionString     = await ResolveConnectionStringAsync(connectionStringName);

        // 构造数据库上下文缓存 Key。
        // 从工作单元的缓存当中获取数据库上下文,不存在则调用 CreateDbContext() 创建。
        var dbContextKey = $"{targetDbContextType.FullName}_{connectionString}";
        var databaseApi  = unitOfWork.FindDatabaseApi(dbContextKey);

        if (databaseApi == null)
        {
            databaseApi = new EfDatabaseApi(await CreateDbContextAsync(unitOfWork, connectionStringName, connectionString));
            unitOfWork.AddDatabaseApi(dbContextKey, databaseApi);
        }

        return((TDbContext)((EfDatabaseApi)databaseApi).DbContext);
    }
예제 #9
0
        private static DbContextCreationContext GetCreationContext <TDbContext>(IServiceProvider serviceProvider)
            where TDbContext : ScorpioDbContext <TDbContext>
        {
            var context = DbContextCreationContext.Current;

            if (context != null)
            {
                return(context);
            }
            var connectionStringName = ConnectionStringNameAttribute.GetConnStringName <TDbContext>();
            var connectionString     = serviceProvider.GetRequiredService <IConnectionStringResolver>().Resolve(connectionStringName);

            return(new DbContextCreationContext(
                       connectionString
                       ));
        }
예제 #10
0
        private static DbContextCreationContext GetCreationContext <TDbContext>(IServiceProvider serviceProvider)
            where TDbContext : AbpDbContext <TDbContext>
        {
            var context = DbContextCreationContext.Current;

            if (context != null)
            {
                return(context);
            }

            var connectionStringName = ConnectionStringNameAttribute.GetConnStringName <TDbContext>();
            var connectionString     = ResolveConnectionString <TDbContext>(serviceProvider, connectionStringName);

            return(new DbContextCreationContext(
                       connectionStringName,
                       connectionString
                       ));
        }
예제 #11
0
        public TDbContext GetDbContext()
        {
            var unitOfWork = _unitOfWorkManager.Current;

            if (unitOfWork == null)
            {
                throw new Exception("A DbContext can only be created inside a unit of work!");
            }

            var connectionStringName = ConnectionStringNameAttribute.GetConnStringName <TDbContext>();
            var connectionString     = _connectionStringResolver.Resolve(connectionStringName);
            var dbContextKey         = $"{typeof(TDbContext).FullName}_{connectionString}";
            var databaseApi          = unitOfWork.GetOrAddDatabaseApi(dbContextKey, () =>
                                                                      new EfCoreDatabaseApi <TDbContext>(CreateDbContext(unitOfWork, connectionStringName, connectionString)
                                                                                                         ));

            return(((EfCoreDatabaseApi <TDbContext>)databaseApi).DbContext);
        }
예제 #12
0
    public async Task <TMongoDbContext> GetDbContextAsync(CancellationToken cancellationToken = default)
    {
        var unitOfWork = _unitOfWorkManager.Current;

        if (unitOfWork == null)
        {
            throw new AbpException(
                      $"A {nameof(IMongoDatabase)} instance can only be created inside a unit of work!");
        }

        var targetDbContextType = _options.GetReplacedTypeOrSelf(typeof(TMongoDbContext));
        var connectionString    = await ResolveConnectionStringAsync(targetDbContextType);

        var dbContextKey = $"{targetDbContextType.FullName}_{connectionString}";

        var mongoUrl     = new MongoUrl(connectionString);
        var databaseName = mongoUrl.DatabaseName;

        if (databaseName.IsNullOrWhiteSpace())
        {
            databaseName = ConnectionStringNameAttribute.GetConnStringName(targetDbContextType);
        }

        //TODO: Create only single MongoDbClient per connection string in an application (extract MongoClientCache for example).
        var databaseApi = unitOfWork.FindDatabaseApi(dbContextKey);

        if (databaseApi == null)
        {
            databaseApi = new MongoDbDatabaseApi(
                await CreateDbContextAsync(
                    unitOfWork,
                    mongoUrl,
                    databaseName,
                    cancellationToken
                    )
                );

            unitOfWork.AddDatabaseApi(dbContextKey, databaseApi);
        }

        return((TMongoDbContext)((MongoDbDatabaseApi)databaseApi).DbContext);
    }
예제 #13
0
        private static DbContextCreationContext GetCreationContext <TDbContext>(IServiceProvider serviceProvider)
            where TDbContext : AbpDbContext <TDbContext>
        {
            var context = DbContextCreationContext.Current;

            if (context != null)
            {
                return(context);
            }

            var connectionStringName = ConnectionStringNameAttribute.GetConnStringName <TDbContext>();

            //Use DefaultConnectionStringResolver.Resolve when we remove IConnectionStringResolver.Resolve
#pragma warning disable 618
            var connectionString = serviceProvider.GetRequiredService <IConnectionStringResolver>().Resolve(connectionStringName);
#pragma warning restore 618

            return(new DbContextCreationContext(
                       connectionStringName,
                       connectionString
                       ));
        }
예제 #14
0
    private static DbContextCreationContext GetCreationContext <TDbContext>(IServiceProvider serviceProvider)
        where TDbContext : DbContext
    {
        // 优先从一个 AsyncLocal 当中获取。
        var context = DbContextCreationContext.Current;

        if (context != null)
        {
            return(context);
        }

        // 从 TDbContext 的 ConnectionStringName 特性获取连接字符串名称。
        // 使用 IConnectionStringResolver 根据指定的名称获得连接字符串。
        var connectionStringName = ConnectionStringNameAttribute.GetConnStringName <TDbContext>();
        var connectionString     = ResolveConnectionString <TDbContext>(serviceProvider, connectionStringName);

        // 构造一个新的 DbContextCreationContext 对象。
        return(new DbContextCreationContext(
                   connectionStringName,
                   connectionString
                   ));
    }
예제 #15
0
    public async Task MigrateAsync()
    {
        var dbContexts = _serviceProvider.GetServices <IAbpMongoDbContext>();
        var connectionStringResolver = _serviceProvider.GetRequiredService <IConnectionStringResolver>();

        foreach (var dbContext in dbContexts)
        {
            var connectionString =
                await connectionStringResolver.ResolveAsync(
                    ConnectionStringNameAttribute.GetConnStringName(dbContext.GetType()));

            var mongoUrl     = new MongoUrl(connectionString);
            var databaseName = mongoUrl.DatabaseName;
            var client       = new MongoClient(mongoUrl);

            if (databaseName.IsNullOrWhiteSpace())
            {
                databaseName = ConnectionStringNameAttribute.GetConnStringName(dbContext.GetType());
            }

            (dbContext as AbpMongoDbContext)?.InitializeCollections(client.GetDatabase(databaseName));
        }
    }
        public TVfpContext GetDbContext()
        {
            var unitOfWork = _unitOfWorkManager.Current;

            if (unitOfWork == null)
            {
                throw new AbpException($"A {nameof(Database)} instance can only be created inside a unit of work!");
            }

            var connectionString = _connectionStringResolver.Resolve <TVfpContext>();
            var dbContextKey     = $"{typeof(TVfpContext).FullName}_{connectionString}";

            //var mongoUrl = new MongoUrl(connectionString);
            string databaseName = @"D:\GitHub\dados\SincaTeste.dbc"; //mongoUrl.DatabaseName;

            if (databaseName.IsNullOrWhiteSpace())
            {
                databaseName = ConnectionStringNameAttribute.GetConnStringName <TVfpContext>();
            }

            //TODO: Create only single MongoDbClient per connection string in an application (extract MongoClientCache for example).
            var databaseApi = unitOfWork.GetOrAddDatabaseApi(
                dbContextKey,
                () =>
            {
                var database = new DbContext(new VfpConnection(@"D:\GitHub\dados\SincaTeste.dbc"), true);

                var dbContext = unitOfWork.ServiceProvider.GetRequiredService <TVfpContext>();

                dbContext.ToAbpVfpContext().InitializeDatabase(database.Database);

                return(new VfpDatabaseApi <TVfpContext>(dbContext));
            });

            return(((VfpDatabaseApi <TVfpContext>)databaseApi).DbContext);
        }
        public static IServiceCollection AddKeyValueDbContext <TKeyValueDbContext>(
            this IServiceCollection serviceCollection,
            Action <KeyValueDbContextCreationOptions <TKeyValueDbContext> > builder = null)
            where TKeyValueDbContext : KeyValueDbContext <TKeyValueDbContext>
        {
            serviceCollection.TryAddSingleton <TKeyValueDbContext>();

            serviceCollection.TryAddTransient <KeyValueDatabaseOptions <TKeyValueDbContext> >(factory =>
            {
                var o    = new KeyValueDatabaseOptions <TKeyValueDbContext>();
                var name = ConnectionStringNameAttribute.GetConnStringName <TKeyValueDbContext>();

                o.ConnectionString = factory.GetRequiredService <IConnectionStringResolver>().Resolve(name);

                return(o);
            });


            var options = new KeyValueDbContextCreationOptions <TKeyValueDbContext>(serviceCollection);

            builder?.Invoke(options);

            return(serviceCollection);
        }
 public void Should_Get_ConnStringName_If_Not_Specified()
 {
     ConnectionStringNameAttribute
     .GetConnStringName <MyClassWithConnStringName>()
     .ShouldBe("MyDb");
 }
예제 #19
0
 public static Task <string> ResolveAsync(this IConnectionStringResolver resolver, Type type)
 {
     return(resolver.ResolveAsync(ConnectionStringNameAttribute.GetConnStringName(type)));
 }
 public static string Resolve <T> (this IConnectionStringResolver resolver)
 {
     return(resolver.Resolve(ConnectionStringNameAttribute.GetConnStringName <T> ()));
 }
 public void Should_Get_Class_FullName_If_Not_ConnStringNameAttribute_Specified()
 {
     ConnectionStringNameAttribute
     .GetConnStringName <MyClassWithoutConnStringName>()
     .ShouldBe(typeof(MyClassWithoutConnStringName).FullName);
 }