From dd715ad9a989aa76245af0c127f1f942abe390a6 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Thu, 5 Jan 2023 14:18:15 +0300 Subject: [PATCH 01/12] Added new packages `@abp/ng.oauth` --- docs/en/Migration-Guides/Abp-7_0.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/en/Migration-Guides/Abp-7_0.md b/docs/en/Migration-Guides/Abp-7_0.md index da8d9c863a..b3ac21834a 100644 --- a/docs/en/Migration-Guides/Abp-7_0.md +++ b/docs/en/Migration-Guides/Abp-7_0.md @@ -115,4 +115,27 @@ See https://github.com/abpframework/abp/pull/13845 for more info. The `Devart.Data.Oracle.EFCore` package do not yet support EF Core 7.0, If you use `AbpEntityFrameworkCoreOracleDevartModule(Volo.Abp.EntityFrameworkCore.Oracle.Devart)` may not work as expected, We will release new packages as soon as they are updated. See https://github.com/abpframework/abp/issues/14412 for more info. +# Changes on Angular Apps +## Added new packages `@abp/ng.oauth` +OAuth Functionality moved to seperated packages that name is `@abp/ng.oauth` So The abp users should add `@abp/ng.oauth` packages on app.module.ts. +Add the new npm package on your app. +``` +yarn add @abp/ng.oauth +// or npm i ---save @abp/ng.oauth +``` +```typescript +// app.module.ts +import { AbpOAuthModule } from "@abp/ng.oauth"; +// ... +@NgModule({ + // ... + imports: [ + AbpOAuthModule.forRoot(), // <-- Add This + // ... + ], + // ... +}) +export class AppModule {} + +``` From b5b31902bef7311da23de6461a5e83187faaf175 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Thu, 5 Jan 2023 14:28:48 +0300 Subject: [PATCH 02/12] Add font-bundle changes on docs --- docs/en/Migration-Guides/Abp-7_0.md | 34 +++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/docs/en/Migration-Guides/Abp-7_0.md b/docs/en/Migration-Guides/Abp-7_0.md index b3ac21834a..ee3902289e 100644 --- a/docs/en/Migration-Guides/Abp-7_0.md +++ b/docs/en/Migration-Guides/Abp-7_0.md @@ -116,8 +116,8 @@ The `Devart.Data.Oracle.EFCore` package do not yet support EF Core 7.0, If you u See https://github.com/abpframework/abp/issues/14412 for more info. # Changes on Angular Apps -## Added new packages `@abp/ng.oauth` -OAuth Functionality moved to seperated packages that name is `@abp/ng.oauth` So The abp users should add `@abp/ng.oauth` packages on app.module.ts. +## Added new package `@abp/ng.oauth` +OAuth Functionality moved to seperated package that name is `@abp/ng.oauth` So The abp users should add `@abp/ng.oauth` packages on app.module.ts. Add the new npm package on your app. ``` yarn add @abp/ng.oauth @@ -139,3 +139,33 @@ import { AbpOAuthModule } from "@abp/ng.oauth"; export class AppModule {} ``` +## Lepton X Google-Font +If you are using leptonx, that has google fonts. The fonts was added builtin lepton file. it moved seperated file. So the abp user should add font-bundle in the angular.json. ( Projects > 'your-app-name' > architect > build > options > styles ) + +// for the lepton x lite +```json + { + input: 'node_modules/@volo/ngx-lepton-x.lite/assets/css/font-bundle.rtl.css', + inject: false, + bundleName: 'font-bundle.rtl', + }, + { + input: 'node_modules/@volo/ngx-lepton-x.lite/assets/css/font-bundle.css', + inject: false, + bundleName: 'font-bundle', + }, +``` + +// for the lepton x +```json + { + input: 'node_modules/@volosoft/ngx-lepton-x/assets/css/font-bundle.css', + inject: false, + bundleName: 'font-bundle', + }, + { + input: 'node_modules/@volosoft/ngx-lepton-x/assets/css/font-bundle.rtl.css', + inject: false, + bundleName: 'font-bundle.rtl', + }, +``` From 5a38b16b12aa88eeda37f637236f7b79e7f2d152 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Thu, 5 Jan 2023 15:10:22 +0300 Subject: [PATCH 03/12] Update Abp-7_0.md --- docs/en/Migration-Guides/Abp-7_0.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/en/Migration-Guides/Abp-7_0.md b/docs/en/Migration-Guides/Abp-7_0.md index ee3902289e..908b2fc618 100644 --- a/docs/en/Migration-Guides/Abp-7_0.md +++ b/docs/en/Migration-Guides/Abp-7_0.md @@ -140,7 +140,7 @@ export class AppModule {} ``` ## Lepton X Google-Font -If you are using leptonx, that has google fonts. The fonts was added builtin lepton file. it moved seperated file. So the abp user should add font-bundle in the angular.json. ( Projects > 'your-app-name' > architect > build > options > styles ) +If you are using leptonx, that has google fonts. The fonts was added builtin lepton file. it moved seperated file. So the abp user should add font-bundle in the angular.json. ( under the 'yourProjectName' > 'architect' > 'build' > 'options' >'styles' ) // for the lepton x lite ```json @@ -169,3 +169,9 @@ If you are using leptonx, that has google fonts. The fonts was added builtin lep bundleName: 'font-bundle.rtl', }, ``` + +## ng-zorro-antd-tree.css + +ng-zorro-antd-tree.css file should be in angular.json if the user uses AbpTree component or Abp-commercial. The ABP User should add this style definition on angular.json. ( under the 'yourProjectName' > 'architect' > 'build' > 'options' >'styles' ) + +{ "input": "node_modules/ng-zorro-antd/tree/style/index.min.css", "inject": false, "bundleName": "ng-zorro-antd-tree" }, From 0713b515cac3535233e586094644ea5a56908a6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fatih=20KILI=C3=87?= Date: Thu, 5 Jan 2023 15:21:10 +0300 Subject: [PATCH 04/12] added side menu layout changes to docs --- docs/en/Migration-Guides/Abp-7_0.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/en/Migration-Guides/Abp-7_0.md b/docs/en/Migration-Guides/Abp-7_0.md index ee3902289e..ab994d2f7a 100644 --- a/docs/en/Migration-Guides/Abp-7_0.md +++ b/docs/en/Migration-Guides/Abp-7_0.md @@ -169,3 +169,11 @@ If you are using leptonx, that has google fonts. The fonts was added builtin lep bundleName: 'font-bundle.rtl', }, ``` + +## Updated Side Menu Layout + +In side menu layout affected some keys in SideMenuApplicationLayoutComponent and added new replaceable component like Logo Component, Language Component etc. + +If you are using replaceable component system you can check [documentation](https://docs.abp.io/en/commercial/latest/themes/lepton-x/angular). + + From 346f5f5e609724bff7eff9064fe0acd1930d7b3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fatih=20KILI=C3=87?= Date: Thu, 5 Jan 2023 15:24:23 +0300 Subject: [PATCH 05/12] resolve conflicit --- docs/en/Migration-Guides/Abp-7_0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Migration-Guides/Abp-7_0.md b/docs/en/Migration-Guides/Abp-7_0.md index c624fdfd9e..63950a9adc 100644 --- a/docs/en/Migration-Guides/Abp-7_0.md +++ b/docs/en/Migration-Guides/Abp-7_0.md @@ -182,4 +182,4 @@ If you are using replaceable component system you can check [documentation](http ng-zorro-antd-tree.css file should be in angular.json if the user uses AbpTree component or Abp-commercial. The ABP User should add this style definition on angular.json. ( under the 'yourProjectName' > 'architect' > 'build' > 'options' >'styles' ) { "input": "node_modules/ng-zorro-antd/tree/style/index.min.css", "inject": false, "bundleName": "ng-zorro-antd-tree" }, ->>>>>>> 5a38b16b12aa88eeda37f637236f7b79e7f2d152 + From dc0697a2d37be1dc92ae9462a3b40bea5363a4b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fatih=20KILI=C3=87?= Date: Thu, 5 Jan 2023 16:03:25 +0300 Subject: [PATCH 06/12] add changed keys --- docs/en/Migration-Guides/Abp-7_0.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/docs/en/Migration-Guides/Abp-7_0.md b/docs/en/Migration-Guides/Abp-7_0.md index 63950a9adc..242ea68980 100644 --- a/docs/en/Migration-Guides/Abp-7_0.md +++ b/docs/en/Migration-Guides/Abp-7_0.md @@ -172,9 +172,24 @@ If you are using leptonx, that has google fonts. The fonts was added builtin lep ## Updated Side Menu Layout -In side menu layout affected some keys in SideMenuApplicationLayoutComponent and added new replaceable component like Logo Component, Language Component etc. +In side menu layout affected toolbarKey, navbarKey, toolbarItemsKey keys in SideMenuApplicationLayoutComponent like below. -If you are using replaceable component system you can check [documentation](https://docs.abp.io/en/commercial/latest/themes/lepton-x/angular). +#### Before +```ts +toolbarKey = eThemeLeptonXComponents.Navbar; +navbarKey = eThemeLeptonXComponents.Sidebar; +toolbarItemsKey = eThemeLeptonXComponents.NavItems; +``` + +#### After +```ts +toolbarKey = eThemeLeptonXComponents.Toolbar; +navbarKey = eThemeLeptonXComponents.Navbar; +navItemsKey = eThemeLeptonXComponents.NavItems; +``` +And also added new replaceable component like Logo Component, Language Component etc. + +If you are using replaceable component system you can check [documentation](https://docs.abp.io/en/commercial/latest/themes/lepton-x/angular#customization). ## ng-zorro-antd-tree.css From fd0fb4fbb058b104ecef8ff6d0a3ec66570b3e29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fatih=20KILI=C3=87?= Date: Thu, 5 Jan 2023 16:41:18 +0300 Subject: [PATCH 07/12] change keys --- docs/en/Migration-Guides/Abp-7_0.md | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/docs/en/Migration-Guides/Abp-7_0.md b/docs/en/Migration-Guides/Abp-7_0.md index 242ea68980..c92129c534 100644 --- a/docs/en/Migration-Guides/Abp-7_0.md +++ b/docs/en/Migration-Guides/Abp-7_0.md @@ -172,21 +172,9 @@ If you are using leptonx, that has google fonts. The fonts was added builtin lep ## Updated Side Menu Layout -In side menu layout affected toolbarKey, navbarKey, toolbarItemsKey keys in SideMenuApplicationLayoutComponent like below. +In side menu layout affected eThemeLeptonXComponents.Navbar to eThemeLeptonXComponents.Toolbar, +eThemeLeptonXComponents.Sidebar to eThemeLeptonXComponents.Navbar. -#### Before -```ts -toolbarKey = eThemeLeptonXComponents.Navbar; -navbarKey = eThemeLeptonXComponents.Sidebar; -toolbarItemsKey = eThemeLeptonXComponents.NavItems; -``` - -#### After -```ts -toolbarKey = eThemeLeptonXComponents.Toolbar; -navbarKey = eThemeLeptonXComponents.Navbar; -navItemsKey = eThemeLeptonXComponents.NavItems; -``` And also added new replaceable component like Logo Component, Language Component etc. If you are using replaceable component system you can check [documentation](https://docs.abp.io/en/commercial/latest/themes/lepton-x/angular#customization). From 0871e07326865768f871952b77119ebcb385f965 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 6 Jan 2023 14:21:02 +0800 Subject: [PATCH 08/12] Add `AlwaysDisableTransactionsUnitOfWorkManager`. --- ...aysDisableTransactionsUnitOfWorkManager.cs | 39 +++++++++++++++++++ .../Abp/Uow/UnitOfWorkCollectionExtensions.cs | 12 ++++++ ...lwaysDisableUnitOfWorkTransaction_Tests.cs | 28 +++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 framework/src/Volo.Abp.Uow/Volo/Abp/Uow/AlwaysDisableTransactionsUnitOfWorkManager.cs create mode 100644 framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkCollectionExtensions.cs create mode 100644 framework/test/Volo.Abp.Uow.Tests/Volo/Abp/Uow/AlwaysDisableUnitOfWorkTransaction_Tests.cs diff --git a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/AlwaysDisableTransactionsUnitOfWorkManager.cs b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/AlwaysDisableTransactionsUnitOfWorkManager.cs new file mode 100644 index 0000000000..a02f63c3e1 --- /dev/null +++ b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/AlwaysDisableTransactionsUnitOfWorkManager.cs @@ -0,0 +1,39 @@ +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Uow; + +[DisableConventionalRegistration] +public class AlwaysDisableTransactionsUnitOfWorkManager : IUnitOfWorkManager +{ + private readonly UnitOfWorkManager _unitOfWorkManager; + + public AlwaysDisableTransactionsUnitOfWorkManager(UnitOfWorkManager unitOfWorkManager) + { + _unitOfWorkManager = unitOfWorkManager; + } + + public IUnitOfWork Current => _unitOfWorkManager.Current; + + public IUnitOfWork Begin(AbpUnitOfWorkOptions options, bool requiresNew = false) + { + options.IsTransactional = false; + return _unitOfWorkManager.Begin(options, requiresNew); + } + + public IUnitOfWork Reserve(string reservationName, bool requiresNew = false) + { + return _unitOfWorkManager.Reserve(reservationName, requiresNew); + } + + public void BeginReserved(string reservationName, AbpUnitOfWorkOptions options) + { + options.IsTransactional = false; + _unitOfWorkManager.BeginReserved(reservationName, options); + } + + public bool TryBeginReserved(string reservationName, AbpUnitOfWorkOptions options) + { + options.IsTransactional = false; + return _unitOfWorkManager.TryBeginReserved(reservationName, options); + } +} diff --git a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkCollectionExtensions.cs b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkCollectionExtensions.cs new file mode 100644 index 0000000000..fb47ccc83c --- /dev/null +++ b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkCollectionExtensions.cs @@ -0,0 +1,12 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; + +namespace Volo.Abp.Uow; + +public static class UnitOfWorkCollectionExtensions +{ + public static IServiceCollection AddAlwaysDisableUnitOfWorkTransaction(this IServiceCollection services) + { + return services.Replace(ServiceDescriptor.Singleton()); + } +} diff --git a/framework/test/Volo.Abp.Uow.Tests/Volo/Abp/Uow/AlwaysDisableUnitOfWorkTransaction_Tests.cs b/framework/test/Volo.Abp.Uow.Tests/Volo/Abp/Uow/AlwaysDisableUnitOfWorkTransaction_Tests.cs new file mode 100644 index 0000000000..56c2ea89e3 --- /dev/null +++ b/framework/test/Volo.Abp.Uow.Tests/Volo/Abp/Uow/AlwaysDisableUnitOfWorkTransaction_Tests.cs @@ -0,0 +1,28 @@ +using Microsoft.Extensions.DependencyInjection; +using Shouldly; +using Volo.Abp.Testing; +using Xunit; + +namespace Volo.Abp.Uow; + +public class AlwaysDisableUnitOfWorkTransaction_Tests: AbpIntegratedTest +{ + protected override void AfterAddApplication(IServiceCollection services) + { + services.AddAlwaysDisableUnitOfWorkTransaction(); + } + + [Fact] + public void AlwaysDisableUnitOfWorkTransaction_Test() + { + GetService().ShouldNotBeNull(); + + var unitOfWorkManager = ServiceProvider.GetRequiredService(); + unitOfWorkManager.GetType().ShouldBe(typeof(AlwaysDisableTransactionsUnitOfWorkManager)); + + using (var uow = unitOfWorkManager.Begin(isTransactional: true)) + { + uow.Options.IsTransactional.ShouldBeFalse(); + } + } +} From 2dfdfff2948ef204da26a014b2981cc6363f72d7 Mon Sep 17 00:00:00 2001 From: Hamza Albreem <94292623+braim23@users.noreply.github.com> Date: Fri, 6 Jan 2023 10:58:16 +0300 Subject: [PATCH 09/12] Quick fix for the Abp-7_0 doc --- docs/en/Migration-Guides/Abp-7_0.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/en/Migration-Guides/Abp-7_0.md b/docs/en/Migration-Guides/Abp-7_0.md index c92129c534..05dc276e3d 100644 --- a/docs/en/Migration-Guides/Abp-7_0.md +++ b/docs/en/Migration-Guides/Abp-7_0.md @@ -116,9 +116,9 @@ The `Devart.Data.Oracle.EFCore` package do not yet support EF Core 7.0, If you u See https://github.com/abpframework/abp/issues/14412 for more info. # Changes on Angular Apps -## Added new package `@abp/ng.oauth` -OAuth Functionality moved to seperated package that name is `@abp/ng.oauth` So The abp users should add `@abp/ng.oauth` packages on app.module.ts. -Add the new npm package on your app. +## Added a new package `@abp/ng.oauth` +OAuth Functionality moved to a seperate package named `@abp/ng.oauth`, so ABP users should add the `@abp/ng.oauth` packages on app.module.ts. +Add the new npm package to your app. ``` yarn add @abp/ng.oauth // or npm i ---save @abp/ng.oauth @@ -140,9 +140,9 @@ export class AppModule {} ``` ## Lepton X Google-Font -If you are using leptonx, that has google fonts. The fonts was added builtin lepton file. it moved seperated file. So the abp user should add font-bundle in the angular.json. ( under the 'yourProjectName' > 'architect' > 'build' > 'options' >'styles' ) +If you are using LeptonX that has google fonts, the fonts were built-in the Lepton file. It's been moved to a seperate file. So the ABP user should add font-bundle in angular.json. ( under the 'yourProjectName' > 'architect' > 'build' > 'options' >'styles' ) -// for the lepton x lite +// for LeptonX Lite ```json { input: 'node_modules/@volo/ngx-lepton-x.lite/assets/css/font-bundle.rtl.css', @@ -156,7 +156,7 @@ If you are using leptonx, that has google fonts. The fonts was added builtin lep }, ``` -// for the lepton x +// for LeptonX ```json { input: 'node_modules/@volosoft/ngx-lepton-x/assets/css/font-bundle.css', @@ -172,7 +172,7 @@ If you are using leptonx, that has google fonts. The fonts was added builtin lep ## Updated Side Menu Layout -In side menu layout affected eThemeLeptonXComponents.Navbar to eThemeLeptonXComponents.Toolbar, +In side menu layout, eThemeLeptonXComponents.Navbar has been changed to eThemeLeptonXComponents.Toolbar, and eThemeLeptonXComponents.Sidebar to eThemeLeptonXComponents.Navbar. And also added new replaceable component like Logo Component, Language Component etc. From 47a46d122fed3ec66394a9fd3933c6e96e2352ac Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 9 Jan 2023 16:11:28 +0800 Subject: [PATCH 10/12] Add `IAbpConnectionStringChecker`. --- .../AbpEfCoreMySqlConnectionStringChecker.cs | 37 ++++++++++++++++++ ...CoreOracleDevartConnectionStringChecker.cs | 35 +++++++++++++++++ .../AbpEfCoreOracleConnectionStringChecker.cs | 35 +++++++++++++++++ .../AbpEfCoreNpgsqlConnectionStringChecker.cs | 39 +++++++++++++++++++ ...pEfCoreSqlServerConnectionStringChecker.cs | 37 ++++++++++++++++++ .../AbpEfCoreSqliteConnectionStringChecker.cs | 30 ++++++++++++++ .../AbpConnectionStringCheckResult.cs | 8 ++++ .../IAbpConnectionStringChecker.cs | 8 ++++ .../AbpConnectionStringChecker_Tests.cs | 17 ++++++++ 9 files changed, 246 insertions(+) create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleDevartConnectionStringChecker.cs create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleConnectionStringChecker.cs create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreNpgsqlConnectionStringChecker.cs create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringCheckResult.cs create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/IAbpConnectionStringChecker.cs create mode 100644 framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringChecker_Tests.cs diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs new file mode 100644 index 0000000000..75713635fe --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs @@ -0,0 +1,37 @@ +using System; +using System.Threading.Tasks; +using MySqlConnector; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; + +[ExposeServices(typeof(IAbpConnectionStringChecker))] +public class AbpEfCoreMySqlConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +{ + public virtual async Task CheckAsync(string connectionString) + { + var result = new AbpConnectionStringCheckResult(); + var connString = new MySqlConnectionStringBuilder(connectionString) + { + ConnectionLifeTime = 1 + }; + + var oldDatabaseName = connString.Database; + connString.Database = "mysql"; + + try + { + await using var conn = new MySqlConnection(connString.ConnectionString); + await conn.OpenAsync(); + result.Connected = true; + await conn.ChangeDatabaseAsync(oldDatabaseName); + await conn.CloseAsync(); + result.DatabaseExists = true; + return result; + } + catch (Exception e) + { + return result; + } + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleDevartConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleDevartConnectionStringChecker.cs new file mode 100644 index 0000000000..50441ac25e --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleDevartConnectionStringChecker.cs @@ -0,0 +1,35 @@ +using System; +using System.Threading.Tasks; +using Devart.Data.Oracle; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; + +[ExposeServices(typeof(IAbpConnectionStringChecker))] +public class AbpEfCoreOracleDevartConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +{ + public virtual async Task CheckAsync(string connectionString) + { + var result = new AbpConnectionStringCheckResult(); + var connString = new OracleConnectionStringBuilder(connectionString) + { + ConnectionTimeout = 1 + }; + + try + { + await using var conn = new OracleConnection(connString.ConnectionString); + await conn.OpenAsync(); + result.Connected = true; + result.DatabaseExists = true; + + await conn.CloseAsync(); + + return result; + } + catch (Exception e) + { + return result; + } + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleConnectionStringChecker.cs new file mode 100644 index 0000000000..d8ce99f28b --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleConnectionStringChecker.cs @@ -0,0 +1,35 @@ +using System; +using System.Threading.Tasks; +using Oracle.ManagedDataAccess.Client; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; + +[ExposeServices(typeof(IAbpConnectionStringChecker))] +public class AbpEfCoreOracleConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +{ + public virtual async Task CheckAsync(string connectionString) + { + var result = new AbpConnectionStringCheckResult(); + var connString = new OracleConnectionStringBuilder(connectionString) + { + ConnectionTimeout = 1 + }; + + try + { + await using var conn = new OracleConnection(connString.ConnectionString); + await conn.OpenAsync(); + result.Connected = true; + result.DatabaseExists = true; + + await conn.CloseAsync(); + + return result; + } + catch (Exception e) + { + return result; + } + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreNpgsqlConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreNpgsqlConnectionStringChecker.cs new file mode 100644 index 0000000000..94f3a5ffee --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreNpgsqlConnectionStringChecker.cs @@ -0,0 +1,39 @@ +using System; +using System.Threading.Tasks; +using Npgsql; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; + +[ExposeServices(typeof(IAbpConnectionStringChecker))] +public class AbpEfCoreNpgsqlConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +{ + public virtual async Task CheckAsync(string connectionString) + { + var result = new AbpConnectionStringCheckResult(); + var connString = new NpgsqlConnectionStringBuilder(connectionString) + { + Timeout = 1 + }; + + var oldDatabaseName = connString.Database; + connString.Database = "postgres"; + + try + { + await using var conn = new NpgsqlConnection(connString.ConnectionString); + await conn.OpenAsync(); + result.Connected = true; + await conn.ChangeDatabaseAsync(oldDatabaseName); + result.DatabaseExists = true; + + await conn.CloseAsync(); + + return result; + } + catch (Exception e) + { + return result; + } + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs new file mode 100644 index 0000000000..4265193faa --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs @@ -0,0 +1,37 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Data.SqlClient; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; + +[ExposeServices(typeof(IAbpConnectionStringChecker))] +public class AbpEfCoreSqlServerConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +{ + public virtual async Task CheckAsync(string connectionString) + { + var result = new AbpConnectionStringCheckResult(); + var connString = new SqlConnectionStringBuilder(connectionString) + { + ConnectTimeout = 1 + }; + + var oldDatabaseName = connString.InitialCatalog; + connString.InitialCatalog = "master"; + + try + { + await using var conn = new SqlConnection(connString.ConnectionString); + await conn.OpenAsync(); + result.Connected = true; + await conn.ChangeDatabaseAsync(oldDatabaseName); + await conn.CloseAsync(); + result.DatabaseExists = true; + return result; + } + catch (Exception e) + { + return result; + } + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs new file mode 100644 index 0000000000..c11b4357b8 --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs @@ -0,0 +1,30 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Data.Sqlite; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; + +[ExposeServices(typeof(IAbpConnectionStringChecker))] +public class AbpEfCoreSqliteConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +{ + public virtual async Task CheckAsync(string connectionString) + { + var result = new AbpConnectionStringCheckResult(); + + try + { + await using var conn = new SqliteConnection(connectionString); + await conn.OpenAsync(); + result.Connected = true; + result.DatabaseExists = true; + await conn.CloseAsync(); + + return result; + } + catch (Exception e) + { + return result; + } + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringCheckResult.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringCheckResult.cs new file mode 100644 index 0000000000..53afc000fb --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringCheckResult.cs @@ -0,0 +1,8 @@ +namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; + +public class AbpConnectionStringCheckResult +{ + public bool Connected { get; set; } + + public bool DatabaseExists { get; set; } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/IAbpConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/IAbpConnectionStringChecker.cs new file mode 100644 index 0000000000..2870c2103e --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/IAbpConnectionStringChecker.cs @@ -0,0 +1,8 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; + +public interface IAbpConnectionStringChecker +{ + Task CheckAsync(string connectionString); +} diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringChecker_Tests.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringChecker_Tests.cs new file mode 100644 index 0000000000..ef3e37df24 --- /dev/null +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringChecker_Tests.cs @@ -0,0 +1,17 @@ +using System.Threading.Tasks; +using Shouldly; +using Xunit; + +namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; + +public class AbpConnectionStringChecker_Tests : EntityFrameworkCoreTestBase +{ + [Fact] + public async Task IsValidAsync() + { + var connectionStringChecker = GetRequiredService(); + var result = await connectionStringChecker.CheckAsync(@"Data Source=:memory:"); + result.Connected.ShouldBeTrue(); + result.DatabaseExists.ShouldBeTrue(); + } +} From 5639d6511318c6398b4db7c81fe319a36eda147d Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 9 Jan 2023 16:14:09 +0800 Subject: [PATCH 11/12] Set `DatabaseExists` before closing. --- .../AbpEfCoreMySqlConnectionStringChecker.cs | 4 +++- .../AbpEfCoreSqlServerConnectionStringChecker.cs | 4 +++- .../AbpEfCoreSqliteConnectionStringChecker.cs | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs index 75713635fe..1f291c60c7 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs @@ -25,8 +25,10 @@ public class AbpEfCoreMySqlConnectionStringChecker : IAbpConnectionStringChecker await conn.OpenAsync(); result.Connected = true; await conn.ChangeDatabaseAsync(oldDatabaseName); - await conn.CloseAsync(); result.DatabaseExists = true; + + await conn.CloseAsync(); + return result; } catch (Exception e) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs index 4265193faa..5473dd95d0 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs @@ -25,8 +25,10 @@ public class AbpEfCoreSqlServerConnectionStringChecker : IAbpConnectionStringChe await conn.OpenAsync(); result.Connected = true; await conn.ChangeDatabaseAsync(oldDatabaseName); - await conn.CloseAsync(); result.DatabaseExists = true; + + await conn.CloseAsync(); + return result; } catch (Exception e) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs index c11b4357b8..bc168973d9 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs @@ -18,6 +18,7 @@ public class AbpEfCoreSqliteConnectionStringChecker : IAbpConnectionStringChecke await conn.OpenAsync(); result.Connected = true; result.DatabaseExists = true; + await conn.CloseAsync(); return result; From 691b28eadbcc99c084b811745084200b1c7670d3 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 9 Jan 2023 16:42:44 +0800 Subject: [PATCH 12/12] Add `MongoDBConnectionStringChecker`. --- .../Data}/AbpConnectionStringCheckResult.cs | 2 +- .../Data/DefaultConnectionStringChecker.cs | 16 ++++++++++ .../Abp/Data/IConnectionStringChecker.cs} | 4 +-- ...ker.cs => MySqlConnectionStringChecker.cs} | 5 ++-- ...=> OracleDevartConnectionStringChecker.cs} | 5 ++-- ...er.cs => OracleConnectionStringChecker.cs} | 5 ++-- ...er.cs => NpgsqlConnectionStringChecker.cs} | 5 ++-- ...cs => SqlServerConnectionStringChecker.cs} | 5 ++-- ...er.cs => SqliteConnectionStringChecker.cs} | 5 ++-- .../MongoDBConnectionStringChecker.cs | 30 +++++++++++++++++++ .../AbpConnectionStringChecker_Tests.cs | 3 +- 11 files changed, 69 insertions(+), 16 deletions(-) rename framework/src/{Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings => Volo.Abp.Data/Volo/Abp/Data}/AbpConnectionStringCheckResult.cs (69%) create mode 100644 framework/src/Volo.Abp.Data/Volo/Abp/Data/DefaultConnectionStringChecker.cs rename framework/src/{Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/IAbpConnectionStringChecker.cs => Volo.Abp.Data/Volo/Abp/Data/IConnectionStringChecker.cs} (52%) rename framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/{AbpEfCoreMySqlConnectionStringChecker.cs => MySqlConnectionStringChecker.cs} (86%) rename framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/{AbpEfCoreOracleDevartConnectionStringChecker.cs => OracleDevartConnectionStringChecker.cs} (83%) rename framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/{AbpEfCoreOracleConnectionStringChecker.cs => OracleConnectionStringChecker.cs} (84%) rename framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/{AbpEfCoreNpgsqlConnectionStringChecker.cs => NpgsqlConnectionStringChecker.cs} (86%) rename framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/{AbpEfCoreSqlServerConnectionStringChecker.cs => SqlServerConnectionStringChecker.cs} (86%) rename framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/{AbpEfCoreSqliteConnectionStringChecker.cs => SqliteConnectionStringChecker.cs} (81%) create mode 100644 framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/ConnectionStrings/MongoDBConnectionStringChecker.cs diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringCheckResult.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpConnectionStringCheckResult.cs similarity index 69% rename from framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringCheckResult.cs rename to framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpConnectionStringCheckResult.cs index 53afc000fb..64d955a760 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringCheckResult.cs +++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpConnectionStringCheckResult.cs @@ -1,4 +1,4 @@ -namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; +namespace Volo.Abp.Data; public class AbpConnectionStringCheckResult { diff --git a/framework/src/Volo.Abp.Data/Volo/Abp/Data/DefaultConnectionStringChecker.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DefaultConnectionStringChecker.cs new file mode 100644 index 0000000000..9ce04a71b9 --- /dev/null +++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DefaultConnectionStringChecker.cs @@ -0,0 +1,16 @@ +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Data; + +public class DefaultConnectionStringChecker : IConnectionStringChecker, ITransientDependency +{ + public Task CheckAsync(string connectionString) + { + return Task.FromResult(new AbpConnectionStringCheckResult + { + Connected = false, + DatabaseExists = false + }); + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/IAbpConnectionStringChecker.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/IConnectionStringChecker.cs similarity index 52% rename from framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/IAbpConnectionStringChecker.cs rename to framework/src/Volo.Abp.Data/Volo/Abp/Data/IConnectionStringChecker.cs index 2870c2103e..159a52acc3 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ConnectionStrings/IAbpConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/IConnectionStringChecker.cs @@ -1,8 +1,8 @@ using System.Threading.Tasks; -namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; +namespace Volo.Abp.Data; -public interface IAbpConnectionStringChecker +public interface IConnectionStringChecker { Task CheckAsync(string connectionString); } diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/MySqlConnectionStringChecker.cs similarity index 86% rename from framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs rename to framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/MySqlConnectionStringChecker.cs index 1f291c60c7..a77821b9df 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreMySqlConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/MySqlConnectionStringChecker.cs @@ -1,12 +1,13 @@ using System; using System.Threading.Tasks; using MySqlConnector; +using Volo.Abp.Data; using Volo.Abp.DependencyInjection; namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; -[ExposeServices(typeof(IAbpConnectionStringChecker))] -public class AbpEfCoreMySqlConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +[Dependency(ReplaceServices = true)] +public class MySqlConnectionStringChecker : IConnectionStringChecker, ITransientDependency { public virtual async Task CheckAsync(string connectionString) { diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleDevartConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/OracleDevartConnectionStringChecker.cs similarity index 83% rename from framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleDevartConnectionStringChecker.cs rename to framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/OracleDevartConnectionStringChecker.cs index 50441ac25e..1bbc300ec8 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleDevartConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/OracleDevartConnectionStringChecker.cs @@ -1,12 +1,13 @@ using System; using System.Threading.Tasks; using Devart.Data.Oracle; +using Volo.Abp.Data; using Volo.Abp.DependencyInjection; namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; -[ExposeServices(typeof(IAbpConnectionStringChecker))] -public class AbpEfCoreOracleDevartConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +[Dependency(ReplaceServices = true)] +public class OracleDevartConnectionStringChecker : IConnectionStringChecker, ITransientDependency { public virtual async Task CheckAsync(string connectionString) { diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/OracleConnectionStringChecker.cs similarity index 84% rename from framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleConnectionStringChecker.cs rename to framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/OracleConnectionStringChecker.cs index d8ce99f28b..1176a9ce64 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreOracleConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/OracleConnectionStringChecker.cs @@ -1,12 +1,13 @@ using System; using System.Threading.Tasks; using Oracle.ManagedDataAccess.Client; +using Volo.Abp.Data; using Volo.Abp.DependencyInjection; namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; -[ExposeServices(typeof(IAbpConnectionStringChecker))] -public class AbpEfCoreOracleConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +[Dependency(ReplaceServices = true)] +public class OracleConnectionStringChecker : IConnectionStringChecker, ITransientDependency { public virtual async Task CheckAsync(string connectionString) { diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreNpgsqlConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/NpgsqlConnectionStringChecker.cs similarity index 86% rename from framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreNpgsqlConnectionStringChecker.cs rename to framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/NpgsqlConnectionStringChecker.cs index 94f3a5ffee..f3ab83eb55 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreNpgsqlConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/NpgsqlConnectionStringChecker.cs @@ -1,12 +1,13 @@ using System; using System.Threading.Tasks; using Npgsql; +using Volo.Abp.Data; using Volo.Abp.DependencyInjection; namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; -[ExposeServices(typeof(IAbpConnectionStringChecker))] -public class AbpEfCoreNpgsqlConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +[Dependency(ReplaceServices = true)] +public class NpgsqlConnectionStringChecker : IConnectionStringChecker, ITransientDependency { public virtual async Task CheckAsync(string connectionString) { diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/SqlServerConnectionStringChecker.cs similarity index 86% rename from framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs rename to framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/SqlServerConnectionStringChecker.cs index 5473dd95d0..668aec3d96 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqlServerConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/SqlServerConnectionStringChecker.cs @@ -1,12 +1,13 @@ using System; using System.Threading.Tasks; using Microsoft.Data.SqlClient; +using Volo.Abp.Data; using Volo.Abp.DependencyInjection; namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; -[ExposeServices(typeof(IAbpConnectionStringChecker))] -public class AbpEfCoreSqlServerConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +[Dependency(ReplaceServices = true)] +public class SqlServerConnectionStringChecker : IConnectionStringChecker, ITransientDependency { public virtual async Task CheckAsync(string connectionString) { diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/SqliteConnectionStringChecker.cs similarity index 81% rename from framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs rename to framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/SqliteConnectionStringChecker.cs index bc168973d9..48b428ce8f 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpEfCoreSqliteConnectionStringChecker.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/SqliteConnectionStringChecker.cs @@ -1,12 +1,13 @@ using System; using System.Threading.Tasks; using Microsoft.Data.Sqlite; +using Volo.Abp.Data; using Volo.Abp.DependencyInjection; namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; -[ExposeServices(typeof(IAbpConnectionStringChecker))] -public class AbpEfCoreSqliteConnectionStringChecker : IAbpConnectionStringChecker, ITransientDependency +[Dependency(ReplaceServices = true)] +public class SqliteConnectionStringChecker : IConnectionStringChecker, ITransientDependency { public virtual async Task CheckAsync(string connectionString) { diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/ConnectionStrings/MongoDBConnectionStringChecker.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/ConnectionStrings/MongoDBConnectionStringChecker.cs new file mode 100644 index 0000000000..f77335f285 --- /dev/null +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/ConnectionStrings/MongoDBConnectionStringChecker.cs @@ -0,0 +1,30 @@ +using System; +using System.Threading.Tasks; +using MongoDB.Driver; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.MongoDB.ConnectionStrings; + +[Dependency(ReplaceServices = true)] +public class MongoDBConnectionStringChecker : IConnectionStringChecker, ITransientDependency +{ + public virtual Task CheckAsync(string connectionString) + { + try + { + var mongoUrl = MongoUrl.Create(connectionString); + var client = new MongoClient(mongoUrl); + client.GetDatabase(mongoUrl.DatabaseName); + return Task.FromResult(new AbpConnectionStringCheckResult() + { + Connected = true, + DatabaseExists = true + }); + } + catch (Exception e) + { + return Task.FromResult(new AbpConnectionStringCheckResult()); + } + } +} diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringChecker_Tests.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringChecker_Tests.cs index ef3e37df24..8889fb8bcd 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringChecker_Tests.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/ConnectionStrings/AbpConnectionStringChecker_Tests.cs @@ -1,5 +1,6 @@ using System.Threading.Tasks; using Shouldly; +using Volo.Abp.Data; using Xunit; namespace Volo.Abp.EntityFrameworkCore.ConnectionStrings; @@ -9,7 +10,7 @@ public class AbpConnectionStringChecker_Tests : EntityFrameworkCoreTestBase [Fact] public async Task IsValidAsync() { - var connectionStringChecker = GetRequiredService(); + var connectionStringChecker = GetRequiredService(); var result = await connectionStringChecker.CheckAsync(@"Data Source=:memory:"); result.Connected.ShouldBeTrue(); result.DatabaseExists.ShouldBeTrue();