From 5f9a0e58b220ac4efbda4a2eba2be2436d727678 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 12 Dec 2016 23:26:45 +0300 Subject: [PATCH] Created basic dynamic connection string resolve and dbcontext configuration infrastructure. --- .../ConsoleDemo/AbpDeskConsoleDemoModule.cs | 27 +++++++++-- .../AbpDesk.ConsoleDemo/appsettings.json | 9 ++++ src/AbpDesk/AbpDesk.ConsoleDemo/project.json | 22 +++++---- .../AbpDeskEntityFrameworkCoreModule.cs | 3 +- src/AbpDesk/AbpDesk.UI/AbpDeskWebAppModule.cs | 29 +++++++++++- src/AbpDesk/AbpDesk.UI/appsettings.json | 9 ++++ src/AbpDesk/AbpDesk.UI/project.json | 1 + .../AbpDbContextConfigurationContext.cs | 34 ++++++++++++++ .../AbpDbContextConfigurerAction.cs | 34 ++++++++++++++ .../AbpEfCoreServiceCollectionExtensions.cs | 47 ++++++++++++++++++- .../IAbpDbContextConfigurer.cs | 15 ++++++ .../Abp/EntityFrameworkCore/AbpDbContext.cs | 2 +- .../AbpDbContextOptions.cs | 34 ++++++++++++++ src/Volo.Abp/Volo/Abp/AbpKernelModule.cs | 1 + .../Volo/Abp/Data/ConnectionStringResolver.cs | 38 +++++++++++++++ .../Volo/Abp/Data/ConnectionStringsOption.cs | 16 +++++++ .../Volo/Abp/Data/DbConnectionOptions.cs | 12 +++++ .../Volo/Abp/Data/IConnectionInfoResolver.cs | 17 ------- .../Abp/Data/IConnectionStringResolver.cs | 7 +++ src/Volo.Abp/project.json | 3 +- .../AbpDesk/AbpDeskApplicationTestModule.cs | 15 +++++- 21 files changed, 340 insertions(+), 35 deletions(-) create mode 100644 src/AbpDesk/AbpDesk.ConsoleDemo/appsettings.json create mode 100644 src/AbpDesk/AbpDesk.UI/appsettings.json create mode 100644 src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpDbContextConfigurationContext.cs create mode 100644 src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpDbContextConfigurerAction.cs create mode 100644 src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/IAbpDbContextConfigurer.cs create mode 100644 src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContextOptions.cs create mode 100644 src/Volo.Abp/Volo/Abp/Data/ConnectionStringResolver.cs create mode 100644 src/Volo.Abp/Volo/Abp/Data/ConnectionStringsOption.cs create mode 100644 src/Volo.Abp/Volo/Abp/Data/DbConnectionOptions.cs delete mode 100644 src/Volo.Abp/Volo/Abp/Data/IConnectionInfoResolver.cs create mode 100644 src/Volo.Abp/Volo/Abp/Data/IConnectionStringResolver.cs diff --git a/src/AbpDesk/AbpDesk.ConsoleDemo/AbpDesk/ConsoleDemo/AbpDeskConsoleDemoModule.cs b/src/AbpDesk/AbpDesk.ConsoleDemo/AbpDesk/ConsoleDemo/AbpDeskConsoleDemoModule.cs index 320499c609..49af835047 100644 --- a/src/AbpDesk/AbpDesk.ConsoleDemo/AbpDesk/ConsoleDemo/AbpDeskConsoleDemoModule.cs +++ b/src/AbpDesk/AbpDesk.ConsoleDemo/AbpDesk/ConsoleDemo/AbpDeskConsoleDemoModule.cs @@ -1,6 +1,10 @@ -using AbpDesk.EntityFrameworkCore; +using System.IO; +using AbpDesk.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Data; +using Volo.Abp.EntityFrameworkCore; using Volo.Abp.Modularity; namespace AbpDesk.ConsoleDemo @@ -10,12 +14,29 @@ namespace AbpDesk.ConsoleDemo { public override void ConfigureServices(IServiceCollection services) { - services.AddDbContext(options => + var configuration = BuildConfiguration(); + + services.Configure(configuration); + + services.Configure(options => { - options.UseSqlServer("Server=localhost;Database=AbpDesk;Trusted_Connection=True;"); + options.Configure(context => + { + context.DbContextOptions.UseSqlServer(context.ConnectionString); + }); }); services.AddAssemblyOf(); } + + private static IConfigurationRoot BuildConfiguration() + { + var builder = new ConfigurationBuilder() + .SetBasePath(Directory.GetCurrentDirectory()) + .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); + + var configuration = builder.Build(); + return configuration; + } } } diff --git a/src/AbpDesk/AbpDesk.ConsoleDemo/appsettings.json b/src/AbpDesk/AbpDesk.ConsoleDemo/appsettings.json new file mode 100644 index 0000000000..71302f7a55 --- /dev/null +++ b/src/AbpDesk/AbpDesk.ConsoleDemo/appsettings.json @@ -0,0 +1,9 @@ +{ + "ConnectionStrings": { + "Default": "Server=localhost;Database=AbpDesk;Trusted_Connection=True;", + "Modules": { + "Module1": "Module1-ConnString", //TODO: Remove this dummy definitions + "Module2": "Module2-ConnString" + } + } +} diff --git a/src/AbpDesk/AbpDesk.ConsoleDemo/project.json b/src/AbpDesk/AbpDesk.ConsoleDemo/project.json index cbc8231774..4f230b066b 100644 --- a/src/AbpDesk/AbpDesk.ConsoleDemo/project.json +++ b/src/AbpDesk/AbpDesk.ConsoleDemo/project.json @@ -1,7 +1,10 @@ -{ +{ "version": "1.0.0-*", - "buildOptions": { - "emitEntryPoint": true + + "frameworks": { + "netcoreapp1.1": { + "imports": "dnxcore50" + } }, "dependencies": { @@ -15,16 +18,19 @@ "Microsoft.EntityFrameworkCore.Tools": { "type": "build", "version": "1.1.0-preview4-final" - } + }, + "Microsoft.Extensions.Configuration.Json": "1.1.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "1.1.0" }, "tools": { "Microsoft.EntityFrameworkCore.Tools": "1.1.0-preview4-final" }, - "frameworks": { - "netcoreapp1.1": { - "imports": "dnxcore50" - } + "buildOptions": { + "emitEntryPoint": true, + "copyToOutput": [ + "appsettings.json" + ] } } diff --git a/src/AbpDesk/AbpDesk.EntityFrameworkCore/AbpDesk/EntityFrameworkCore/AbpDeskEntityFrameworkCoreModule.cs b/src/AbpDesk/AbpDesk.EntityFrameworkCore/AbpDesk/EntityFrameworkCore/AbpDeskEntityFrameworkCoreModule.cs index 7b5b7b9f96..8dce8ac522 100644 --- a/src/AbpDesk/AbpDesk.EntityFrameworkCore/AbpDesk/EntityFrameworkCore/AbpDeskEntityFrameworkCoreModule.cs +++ b/src/AbpDesk/AbpDesk.EntityFrameworkCore/AbpDesk/EntityFrameworkCore/AbpDeskEntityFrameworkCoreModule.cs @@ -10,7 +10,8 @@ namespace AbpDesk.EntityFrameworkCore public override void ConfigureServices(IServiceCollection services) { services.AddAssemblyOf(); - services.AddDefaultEfCoreRepositories(); + services.AddAbpDbContext(); + services.AddDefaultEfCoreRepositories(); //TODO: Move this into AddAbpDbContext as option } } } diff --git a/src/AbpDesk/AbpDesk.UI/AbpDeskWebAppModule.cs b/src/AbpDesk/AbpDesk.UI/AbpDeskWebAppModule.cs index c04eb85db0..3dd74d181f 100644 --- a/src/AbpDesk/AbpDesk.UI/AbpDeskWebAppModule.cs +++ b/src/AbpDesk/AbpDesk.UI/AbpDeskWebAppModule.cs @@ -1,11 +1,16 @@ -using AbpDesk.EntityFrameworkCore; +using System.IO; +using AbpDesk.EntityFrameworkCore; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Volo.Abp.AspNetCore.Modularity; using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.Data; +using Volo.Abp.EntityFrameworkCore; using Volo.Abp.Modularity; namespace AbpDesk @@ -17,6 +22,18 @@ namespace AbpDesk { public override void ConfigureServices(IServiceCollection services) { + var configuration = BuildConfiguration(); + + services.Configure(configuration); + + services.Configure(options => + { + options.Configure(context => + { + context.DbContextOptions.UseSqlServer(context.ConnectionString); + }); + }); + services.AddDbContext(options => { options.UseSqlServer("Server=localhost;Database=AbpDesk;Trusted_Connection=True;"); @@ -45,5 +62,15 @@ namespace AbpDesk template: "{controller=Home}/{action=Index}/{id?}"); }); } + + private static IConfigurationRoot BuildConfiguration() + { + var builder = new ConfigurationBuilder() + .SetBasePath(Directory.GetCurrentDirectory()) //TODO: Get from IHostingEnvironment!!! + .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); + + var configuration = builder.Build(); + return configuration; + } } } diff --git a/src/AbpDesk/AbpDesk.UI/appsettings.json b/src/AbpDesk/AbpDesk.UI/appsettings.json new file mode 100644 index 0000000000..71302f7a55 --- /dev/null +++ b/src/AbpDesk/AbpDesk.UI/appsettings.json @@ -0,0 +1,9 @@ +{ + "ConnectionStrings": { + "Default": "Server=localhost;Database=AbpDesk;Trusted_Connection=True;", + "Modules": { + "Module1": "Module1-ConnString", //TODO: Remove this dummy definitions + "Module2": "Module2-ConnString" + } + } +} diff --git a/src/AbpDesk/AbpDesk.UI/project.json b/src/AbpDesk/AbpDesk.UI/project.json index 9b1c6a996c..4c3aaca385 100644 --- a/src/AbpDesk/AbpDesk.UI/project.json +++ b/src/AbpDesk/AbpDesk.UI/project.json @@ -11,6 +11,7 @@ "Microsoft.AspNetCore.StaticFiles": "1.1.0", "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.1.0", "Microsoft.Extensions.Configuration.Json": "1.1.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "1.1.0", "AbpDesk.Application.Contracts": "1.0.0-*", "Microsoft.EntityFrameworkCore.Tools": { "type": "build", diff --git a/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpDbContextConfigurationContext.cs b/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpDbContextConfigurationContext.cs new file mode 100644 index 0000000000..ea41aa3b01 --- /dev/null +++ b/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpDbContextConfigurationContext.cs @@ -0,0 +1,34 @@ +using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace Microsoft.Extensions.DependencyInjection +{ + public class AbpDbContextConfigurationContext + { + public string ConnectionString { get; } + + public string ModuleName { get; } + + public virtual DbContextOptionsBuilder DbContextOptions { get; protected set; } + + public AbpDbContextConfigurationContext(string connectionString, [CanBeNull] string moduleName) + { + ConnectionString = connectionString; + ModuleName = moduleName; + DbContextOptions = new DbContextOptionsBuilder(); + } + } + + public class AbpDbContextConfigurationContext : AbpDbContextConfigurationContext + where TDbContext : AbpDbContext + { + public new DbContextOptionsBuilder DbContextOptions => (DbContextOptionsBuilder)base.DbContextOptions; + + public AbpDbContextConfigurationContext(string connectionString, [CanBeNull] string moduleName) + : base(connectionString, moduleName) + { + base.DbContextOptions = new DbContextOptionsBuilder(); + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpDbContextConfigurerAction.cs b/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpDbContextConfigurerAction.cs new file mode 100644 index 0000000000..b37dbae82d --- /dev/null +++ b/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpDbContextConfigurerAction.cs @@ -0,0 +1,34 @@ +using System; +using JetBrains.Annotations; +using Volo; +using Volo.Abp.EntityFrameworkCore; + +namespace Microsoft.Extensions.DependencyInjection +{ + public class AbpDbContextConfigurerAction : IAbpDbContextConfigurer + { + [NotNull] + public Action Action { get; } + + public AbpDbContextConfigurerAction([NotNull] Action action) + { + Check.NotNull(action, nameof(action)); + + Action = action; + } + + public void Configure(AbpDbContextConfigurationContext context) + { + Action.Invoke(context); + } + } + + public class AbpDbContextConfigurerAction : AbpDbContextConfigurerAction + where TDbContext : AbpDbContext + { + public AbpDbContextConfigurerAction([NotNull] Action action) + : base(action) + { + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs b/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs index 0d043cd71a..1d55e5344c 100644 --- a/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs +++ b/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs @@ -1,13 +1,58 @@ -using Microsoft.Extensions.DependencyInjection.Extensions; +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Options; +using Volo.Abp; +using Volo.Abp.Data; using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.Repositories.EntityFrameworkCore; +using Volo.ExtensionMethods.Collections.Generic; namespace Microsoft.Extensions.DependencyInjection { public static class AbpEfCoreServiceCollectionExtensions { + public static IServiceCollection AddAbpDbContext( + this IServiceCollection services) + where TDbContext : AbpDbContext + { + services //TODO: This are copied from EntityFrameworkServiceCollectionExtensions, we should think on that later + .AddMemoryCache() + .AddLogging(); + + services.TryAddTransient(); + services.TryAddSingleton(serviceProvider => + { + const string moduleName = ""; + + var connInfoResolver = serviceProvider.GetRequiredService(); + + var context = new AbpDbContextConfigurationContext(connInfoResolver.Resolve(moduleName), moduleName); + + var dbContextOptions = serviceProvider.GetRequiredService>().Value; + + var configureAction = dbContextOptions.ConfigureActions.GetOrDefault(typeof(TDbContext)); + if (configureAction != null) + { + ((Action>) configureAction).Invoke(context); + } + else if(dbContextOptions.DefaultConfigureAction != null) + { + dbContextOptions.DefaultConfigureAction.Invoke(context); + } + else + { + throw new AbpException("Should set a configure action for dbcontext"); //TODO: Better message + } + + return context.DbContextOptions.Options; + }); + + return services; + } + public static IServiceCollection AddDefaultEfCoreRepositories(this IServiceCollection services) where TDbContext : AbpDbContext { diff --git a/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/IAbpDbContextConfigurer.cs b/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/IAbpDbContextConfigurer.cs new file mode 100644 index 0000000000..df6d7a80c2 --- /dev/null +++ b/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/IAbpDbContextConfigurer.cs @@ -0,0 +1,15 @@ +using Volo.Abp.EntityFrameworkCore; + +namespace Microsoft.Extensions.DependencyInjection +{ + public interface IAbpDbContextConfigurer + { + void Configure(AbpDbContextConfigurationContext context); + } + + public interface IAbpDbContextConfigurer + where TDbContext : AbpDbContext + { + void Configure(AbpDbContextConfigurationContext context); + } +} \ No newline at end of file diff --git a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs index ec65fecf08..c1235e85a7 100644 --- a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs +++ b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs @@ -11,4 +11,4 @@ namespace Volo.Abp.EntityFrameworkCore } } -} +} \ No newline at end of file diff --git a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContextOptions.cs b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContextOptions.cs new file mode 100644 index 0000000000..43acfacdaa --- /dev/null +++ b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContextOptions.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using JetBrains.Annotations; +using Microsoft.Extensions.DependencyInjection; + +namespace Volo.Abp.EntityFrameworkCore +{ + public class AbpDbContextOptions + { + internal Action DefaultConfigureAction { get; set; } + + internal Dictionary ConfigureActions { get; set; } + + public AbpDbContextOptions() + { + ConfigureActions = new Dictionary(); + } + + public void Configure([NotNull] Action action) + { + Check.NotNull(action, nameof(action)); + + DefaultConfigureAction = action; + } + + public void Configure([NotNull] Action> action) + where TDbContext : AbpDbContext + { + Check.NotNull(action, nameof(action)); + + ConfigureActions[typeof(TDbContext)] = action; + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/AbpKernelModule.cs b/src/Volo.Abp/Volo/Abp/AbpKernelModule.cs index f66d20925e..1b10d0fe6a 100644 --- a/src/Volo.Abp/Volo/Abp/AbpKernelModule.cs +++ b/src/Volo.Abp/Volo/Abp/AbpKernelModule.cs @@ -7,6 +7,7 @@ namespace Volo.Abp { public override void ConfigureServices(IServiceCollection services) { + services.AddOptions(); services.AddAssemblyOf(); } } diff --git a/src/Volo.Abp/Volo/Abp/Data/ConnectionStringResolver.cs b/src/Volo.Abp/Volo/Abp/Data/ConnectionStringResolver.cs new file mode 100644 index 0000000000..67fefa3881 --- /dev/null +++ b/src/Volo.Abp/Volo/Abp/Data/ConnectionStringResolver.cs @@ -0,0 +1,38 @@ +using Microsoft.Extensions.Options; +using Volo.DependencyInjection; +using Volo.ExtensionMethods; +using Volo.ExtensionMethods.Collections.Generic; + +namespace Volo.Abp.Data +{ + public class ConnectionStringResolver : IConnectionStringResolver, ITransientDependency + { + private readonly DbConnectionOptions _options; //TODO: Use IOptionsSnapshot + + public ConnectionStringResolver(IOptions options) + { + _options = options.Value; + } + + public string Resolve(string modulename) + { + //Get default value + var connString = _options.ConnectionStrings.Default; + + //Override by module specific value if provided + if (!modulename.IsNullOrEmpty()) + { + var moduleConnString = _options.ConnectionStrings.Modules.GetOrDefault(modulename); + if (!moduleConnString.IsNullOrEmpty()) + { + connString = moduleConnString; + } + } + + //TODO: Override by tenant conn string + //TODO: Override by tenant module specific conn string + + return connString; + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/Data/ConnectionStringsOption.cs b/src/Volo.Abp/Volo/Abp/Data/ConnectionStringsOption.cs new file mode 100644 index 0000000000..d30387d95b --- /dev/null +++ b/src/Volo.Abp/Volo/Abp/Data/ConnectionStringsOption.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace Volo.Abp.Data +{ + public class ConnectionStringsOption + { + public string Default { get; set; } + + public Dictionary Modules { get; set; } + + public ConnectionStringsOption() + { + Modules = new Dictionary(); + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/Data/DbConnectionOptions.cs b/src/Volo.Abp/Volo/Abp/Data/DbConnectionOptions.cs new file mode 100644 index 0000000000..05cd4e4e9e --- /dev/null +++ b/src/Volo.Abp/Volo/Abp/Data/DbConnectionOptions.cs @@ -0,0 +1,12 @@ +namespace Volo.Abp.Data +{ + public class DbConnectionOptions + { + public ConnectionStringsOption ConnectionStrings { get; set; } + + public DbConnectionOptions() + { + ConnectionStrings = new ConnectionStringsOption(); + } + } +} diff --git a/src/Volo.Abp/Volo/Abp/Data/IConnectionInfoResolver.cs b/src/Volo.Abp/Volo/Abp/Data/IConnectionInfoResolver.cs deleted file mode 100644 index 3a7ce31aab..0000000000 --- a/src/Volo.Abp/Volo/Abp/Data/IConnectionInfoResolver.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace Volo.Abp.Data -{ - public interface IConnectionInfoResolver - { - ConnectionInfo Resolve(); - } - - public class ConnectionInfo - { - public string ConnectionString { get; set; } - } -} diff --git a/src/Volo.Abp/Volo/Abp/Data/IConnectionStringResolver.cs b/src/Volo.Abp/Volo/Abp/Data/IConnectionStringResolver.cs new file mode 100644 index 0000000000..99f40f22b8 --- /dev/null +++ b/src/Volo.Abp/Volo/Abp/Data/IConnectionStringResolver.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.Data +{ + public interface IConnectionStringResolver + { + string Resolve(string modulename); + } +} diff --git a/src/Volo.Abp/project.json b/src/Volo.Abp/project.json index 69460a711e..fa16444863 100644 --- a/src/Volo.Abp/project.json +++ b/src/Volo.Abp/project.json @@ -10,7 +10,8 @@ "Nito.AsyncEx.Context": "1.1.0", "System.Runtime.Loader": "4.3.0", "System.Linq.Queryable": "4.3.0", - "Volo.Abp.ApplicationContracts": "1.0.0-*" + "Volo.Abp.ApplicationContracts": "1.0.0-*", + "Microsoft.Extensions.Options": "1.1.0" }, "frameworks": { diff --git a/test/AbpDesk/AbpDesk.Application.Tests/AbpDesk/AbpDeskApplicationTestModule.cs b/test/AbpDesk/AbpDesk.Application.Tests/AbpDesk/AbpDeskApplicationTestModule.cs index f27c3002ba..2019aec7e3 100644 --- a/test/AbpDesk/AbpDesk.Application.Tests/AbpDesk/AbpDeskApplicationTestModule.cs +++ b/test/AbpDesk/AbpDesk.Application.Tests/AbpDesk/AbpDeskApplicationTestModule.cs @@ -2,6 +2,8 @@ using AbpDesk.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Data; +using Volo.Abp.EntityFrameworkCore; using Volo.Abp.Modularity; namespace AbpDesk @@ -12,9 +14,18 @@ namespace AbpDesk public override void ConfigureServices(IServiceCollection services) { services.AddEntityFrameworkInMemoryDatabase(); - services.AddDbContext(options => + + services.Configure(options => + { + options.ConnectionStrings.Default = Guid.NewGuid().ToString(); + }); + + services.Configure(options => { - options.UseInMemoryDatabase(Guid.NewGuid().ToString()); + options.Configure(context => + { + context.DbContextOptions.UseInMemoryDatabase(context.ConnectionString); + }); }); } }