(mvcBuilder =>
+ {
+ // 添加插件程序集
+ mvcBuilder.PartManager.ApplicationParts.Add(new AssemblyPart(typeof(MyMvcUIPlugInModule).Assembly));
+
+ // 添加视图程序集
+ var viewDllPath = Path.Combine(Path.GetDirectoryName(typeof(MyMvcUIPlugInModule).Assembly.Location), "MyMvcUIPlugIn.Views.dll");
+ var viewAssembly = new CompiledRazorAssemblyPart(Assembly.LoadFrom(viewDllPath));
+ mvcBuilder.PartManager.ApplicationParts.Add(viewAssembly);
+ });
+ }
+ }
+}
+````
+
+* 由于我们添加了相关的NuGet包,因此取决于`AbpAspNetCoreMvcUiThemeSharedModule`.
+* 添加插件程序集到ASP.NET Core MVC的`PartManager`中.这是ASP.NET Core所必需的.否则,你插件中的控制器将无法正常工作.
+* 添加插件的视图程序集到ASP.NET Core MVC的`PartManager`中.这是ASP.NET Core所必需的.否则,你在插件中的视图将不起作用.
+
+现在,你可以在`Pages`目录下添加一个razor页面,例如`MyPlugInPage.cshtml`:
+
+````html
+@page
+@model MyMvcUIPlugIn.Pages.MyPlugInPage
+Welcome to my plug-in page
+This page is located inside a plug-in module! :)
+````
+
+现在,你可以构建插件项目.它将产生以下输出:
+
+
+
+将`MyMvcUIPlugIn.dll`和`MyMvcUIPlugIn.Views.dll`复制到到插件目录下(此示例中为`D:\Temp\MyPlugIns`).
+
+如果你已经按照上述方式配置了主应用程序(参见“基础用法”部分),那么在应用程序启动的时候,你应该能够访问`/MyPlugInPage`URL:
+
+
+
+## 讨论
+
+在现实世界中,你的插件可能具有一些外部依赖性.另外,你的应用程序可能被设计为支持插件.所有这些都是你自己的系统要求.ABP做的仅仅是在应用程序启动时加载模块.你在这些模块中执行什么操作由你决定.
+
+但是,我们可以为一些常见情况提供一些建议.
+
+### 库依赖
+
+对于包/dll依赖,你可以将相关的dll复制到插件目录下.ABP会自动将所有程序集加载到该目录下,并且你的插件将按预期工作.
+
+> 请参见[Microsoft文档](https://docs.microsoft.com/zh-cn/dotnet/core/tutorials/creating-app-with-plugin-support#plugin-with-library-dependencies).
+
+### 数据库模式
+
+如果你的模块使用关系型数据库和[Entity Framework Core](Entity-Framework-Core.md), 那么它需要在数据库中提供表.有多种不同的方法可确保在应用程序使用插件时创建表.一些例子;
+
+1. 插件可以检查数据库表是否存在,并在应用程序启动时创建表,或者如果插件已更新且需要进行某些架构更改时,则会迁移它们.你可以使用EF Core的迁移API来做到这一点.
+2. 你可以改进`DbMigrator`应用程序,用于查找插件的迁移并执行它们.
+
+可能还有其它解决方案.例如,如果你的数据库管理员不允许你在应用程序代码中更改数据库模式,则可能需要手动将SQL文件发送给数据库管理员,以将其应用于数据库.
diff --git a/docs/zh-Hans/Redis-Cache.md b/docs/zh-Hans/Redis-Cache.md
new file mode 100644
index 0000000000..cb82a640d5
--- /dev/null
+++ b/docs/zh-Hans/Redis-Cache.md
@@ -0,0 +1 @@
+TODO...
\ No newline at end of file
diff --git a/docs/zh-Hans/docs-nav.json b/docs/zh-Hans/docs-nav.json
index 5d231099c9..4f47dd2760 100644
--- a/docs/zh-Hans/docs-nav.json
+++ b/docs/zh-Hans/docs-nav.json
@@ -313,7 +313,8 @@
"path": "Module-Development-Basics.md"
},
{
- "text": "模块插件"
+ "text": "模块插件",
+ "path": "PlugIn-Modules.md"
},
{
"text": "自定义应用模块",
diff --git a/docs/zh-Hans/images/simple-plug-in-dll-file.png b/docs/zh-Hans/images/simple-plug-in-dll-file.png
new file mode 100644
index 0000000000..3155708d68
Binary files /dev/null and b/docs/zh-Hans/images/simple-plug-in-dll-file.png differ
diff --git a/docs/zh-Hans/images/simple-plugin-library.png b/docs/zh-Hans/images/simple-plugin-library.png
new file mode 100644
index 0000000000..9fefd57dda
Binary files /dev/null and b/docs/zh-Hans/images/simple-plugin-library.png differ
diff --git a/docs/zh-Hans/images/simple-plugin-output.png b/docs/zh-Hans/images/simple-plugin-output.png
new file mode 100644
index 0000000000..71f6a78c0e
Binary files /dev/null and b/docs/zh-Hans/images/simple-plugin-output.png differ
diff --git a/docs/zh-Hans/images/simple-razor-plug-in-dll-file.png b/docs/zh-Hans/images/simple-razor-plug-in-dll-file.png
new file mode 100644
index 0000000000..06b7a565fe
Binary files /dev/null and b/docs/zh-Hans/images/simple-razor-plug-in-dll-file.png differ
diff --git a/docs/zh-Hans/images/simple-razor-plugin.png b/docs/zh-Hans/images/simple-razor-plugin.png
new file mode 100644
index 0000000000..92e0e00d29
Binary files /dev/null and b/docs/zh-Hans/images/simple-razor-plugin.png differ
diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln
index 963472ada8..8c2670fa27 100644
--- a/framework/Volo.Abp.sln
+++ b/framework/Volo.Abp.sln
@@ -359,6 +359,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Json.Tests", "test
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Http.Tests", "test\Volo.Abp.Http.Tests\Volo.Abp.Http.Tests.csproj", "{A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.EventBus.Abstractions", "src\Volo.Abp.EventBus.Abstractions\Volo.Abp.EventBus.Abstractions.csproj", "{8FDB3BF7-AD89-43F6-8DEB-C3E29B8801FE}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -1069,6 +1071,10 @@ Global
{A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8FDB3BF7-AD89-43F6-8DEB-C3E29B8801FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8FDB3BF7-AD89-43F6-8DEB-C3E29B8801FE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8FDB3BF7-AD89-43F6-8DEB-C3E29B8801FE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8FDB3BF7-AD89-43F6-8DEB-C3E29B8801FE}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -1250,6 +1256,7 @@ Global
{DD9519E0-5A68-48DC-A051-7BF2AC922F3E} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{00D07595-993C-40FC-BD90-0DD6331414D3} = {447C8A77-E5F0-4538-8687-7383196D04EA}
{A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1} = {447C8A77-E5F0-4538-8687-7383196D04EA}
+ {8FDB3BF7-AD89-43F6-8DEB-C3E29B8801FE} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5}
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor
index f9e47c4c27..d6067021ab 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor
+++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor
@@ -10,14 +10,12 @@
if (MenuItem.Url != null)
{
- @if (MenuItem.Icon != null)
- {
- if (MenuItem.Icon.StartsWith("fa"))
- {
-
- }
- }
- @MenuItem.DisplayName
+
+
+
+
+ @MenuItem.DisplayName
+
}
}
diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs
index 0aeb97e89d..eaf5c753fd 100644
--- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs
+++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs
@@ -1,7 +1,14 @@
-using System.Threading.Tasks;
+using System;
+using System.Globalization;
+using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Localization;
+using Microsoft.AspNetCore.RequestLocalization;
+using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
+using Volo.Abp.Localization;
using Volo.Abp.MultiTenancy;
+using Volo.Abp.Settings;
namespace Volo.Abp.AspNetCore.MultiTenancy
{
@@ -21,10 +28,71 @@ namespace Volo.Abp.AspNetCore.MultiTenancy
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
var tenant = await _tenantConfigurationProvider.GetAsync(saveResolveResult: true);
- using (_currentTenant.Change(tenant?.Id, tenant?.Name))
+ if (tenant?.Id != _currentTenant.Id)
+ {
+ using (_currentTenant.Change(tenant?.Id, tenant?.Name))
+ {
+ var requestCulture = await TryGetRequestCultureAsync(context);
+ if (requestCulture != null)
+ {
+ CultureInfo.CurrentCulture = requestCulture.Culture;
+ CultureInfo.CurrentUICulture = requestCulture.UICulture;
+ AbpRequestCultureCookieHelper.SetCultureCookie(
+ context,
+ requestCulture
+ );
+ }
+
+ await next(context);
+ }
+ }
+ else
{
await next(context);
}
}
+
+ private async Task TryGetRequestCultureAsync(HttpContext httpContext)
+ {
+ var requestCultureFeature = httpContext.Features.Get();
+
+ /* If requestCultureFeature == null, that means the RequestLocalizationMiddleware was not used
+ * and we don't want to set the culture. */
+ if (requestCultureFeature == null)
+ {
+ return null;
+ }
+
+ /* If requestCultureFeature.Provider is not null, that means RequestLocalizationMiddleware
+ * already picked a language, so we don't need to set the default. */
+ if (requestCultureFeature.Provider != null)
+ {
+ return null;
+ }
+
+ var settingProvider = httpContext.RequestServices.GetRequiredService();
+ var defaultLanguage = await settingProvider.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage);
+ if (defaultLanguage.IsNullOrWhiteSpace())
+ {
+ return null;
+ }
+
+ string culture;
+ string uiCulture;
+
+ if (defaultLanguage.Contains(';'))
+ {
+ var splitted = defaultLanguage.Split(';');
+ culture = splitted[0];
+ uiCulture = splitted[1];
+ }
+ else
+ {
+ culture = defaultLanguage;
+ uiCulture = defaultLanguage;
+ }
+
+ return new RequestCulture(culture, uiCulture);
+ }
}
}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClientHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClientHelper.cs
index 4b4a0e6301..ae013c4343 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClientHelper.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClientHelper.cs
@@ -7,7 +7,8 @@ namespace Volo.Abp.AspNetCore.Mvc.Client
{
public static string CreateCacheKey(ICurrentUser currentUser)
{
- return $"ApplicationConfiguration_{currentUser.Id?.ToString("N") ?? "Anonymous"}_{CultureInfo.CurrentUICulture.Name}";
+ var userKey = currentUser.Id?.ToString("N") ?? "Anonymous";
+ return $"ApplicationConfiguration_{userKey}_{CultureInfo.CurrentUICulture.Name}";
}
}
}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js
index 431d9093f7..55c604cf4a 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js
@@ -159,7 +159,7 @@
abp.dom.initializers.initializeDatepickers = function ($rootElement) {
$rootElement
- .findWithSelf('input.datepicker,input[type=date]')
+ .findWithSelf('input.datepicker,input[type=date][abp-data-datepicker!=false]')
.each(function () {
var $input = $(this);
$input
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js
index a4d32550f8..75d080feda 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js
@@ -39,7 +39,7 @@ $.validator.defaults.ignore = ''; //TODO: Would be better if we can apply only f
var _$modal = null;
var _$form = null;
- var _modalId = 'Modal_' + (Math.floor((Math.random() * 1000000))) + new Date().getTime();
+ var _modalId = 'Abp_Modal_' + (Math.floor((Math.random() * 1000000))) + new Date().getTime();
var _modalObject = null;
var _publicApi = null;
@@ -56,7 +56,12 @@ $.validator.defaults.ignore = ''; //TODO: Would be better if we can apply only f
function _createContainer() {
_removeContainer();
_$modalContainer = $('');
- $('body').prepend(_$modalContainer);
+ var existsModals = $('[id^="Abp_Modal_"]');
+ if (existsModals.length) {
+ existsModals.last().after(_$modalContainer)
+ } else {
+ $('body').prepend(_$modalContainer);
+ }
return _$modalContainer;
}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js
index 1808f267eb..9895097d99 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js
@@ -334,7 +334,10 @@
};
}
return function (requestData, callback, settings) {
- var input = inputAction ? inputAction(requestData, settings) : {};
+ var input = typeof inputAction === 'function'
+ ? inputAction(requestData, settings)
+ : typeof inputAction === 'object'
+ ? inputAction : {};
//Paging
if (settings.oInit.paging) {
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs
index 06b9c9a620..6b73aa26da 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs
@@ -1,7 +1,7 @@
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Localization;
+using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
using System;
+using Microsoft.AspNetCore.RequestLocalization;
using Volo.Abp.Localization;
namespace Volo.Abp.AspNetCore.Mvc.Localization
@@ -20,12 +20,10 @@ namespace Volo.Abp.AspNetCore.Mvc.Localization
throw new AbpException("Unknown language: " + culture + ". It must be a valid culture!");
}
- string cookieValue = CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture, uiCulture));
-
- Response.Cookies.Append(CookieRequestCultureProvider.DefaultCookieName, cookieValue, new CookieOptions
- {
- Expires = Clock.Now.AddYears(2)
- });
+ AbpRequestCultureCookieHelper.SetCultureCookie(
+ HttpContext,
+ new RequestCulture(culture, uiCulture)
+ );
if (!string.IsNullOrWhiteSpace(returnUrl))
{
diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestCultureCookieHelper.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestCultureCookieHelper.cs
new file mode 100644
index 0000000000..0f27925496
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestCultureCookieHelper.cs
@@ -0,0 +1,23 @@
+using System;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Localization;
+
+namespace Microsoft.AspNetCore.RequestLocalization
+{
+ public static class AbpRequestCultureCookieHelper
+ {
+ public static void SetCultureCookie(
+ HttpContext httpContext,
+ RequestCulture requestCulture)
+ {
+ httpContext.Response.Cookies.Append(
+ CookieRequestCultureProvider.DefaultCookieName,
+ CookieRequestCultureProvider.MakeCookieValue(requestCulture),
+ new CookieOptions
+ {
+ Expires = DateTime.Now.AddYears(2)
+ }
+ );
+ }
+ }
+}
diff --git a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperModule.cs b/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperModule.cs
index 25707e3899..cb576ba1de 100644
--- a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperModule.cs
+++ b/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperModule.cs
@@ -25,7 +25,7 @@ namespace Volo.Abp.AutoMapper
{
context.Services.AddAutoMapperObjectMapper();
- context.Services.AddSingleton(provider => CreateMappings(provider));
+ context.Services.AddSingleton(CreateMappings);
context.Services.AddSingleton(provider => provider.GetRequiredService());
}
@@ -43,6 +43,8 @@ namespace Volo.Abp.AutoMapper
}
}
+ options.Configurators.Insert(0, ctx => ctx.MapperConfiguration.ConstructServicesUsing(serviceProvider.GetService));
+
void ValidateAll(IConfigurationProvider config)
{
foreach (var profileType in options.ValidatingProfiles)
@@ -60,7 +62,7 @@ namespace Volo.Abp.AutoMapper
return new MapperAccessor
{
- Mapper = new Mapper(mapperConfiguration, serviceProvider.GetService)
+ Mapper = new Mapper(mapperConfiguration)
};
}
}
diff --git a/framework/src/Volo.Abp.Autofac/Autofac/Extensions/DependencyInjection/ServiceCollectionExtensions.cs b/framework/src/Volo.Abp.Autofac/Autofac/Extensions/DependencyInjection/ServiceCollectionExtensions.cs
deleted file mode 100644
index 4b61ae5a6e..0000000000
--- a/framework/src/Volo.Abp.Autofac/Autofac/Extensions/DependencyInjection/ServiceCollectionExtensions.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-// This software is part of the Autofac IoC container
-// Copyright © 2017 Autofac Contributors
-// http://autofac.org
-//
-// Permission is hereby granted, free of charge, to any person
-// obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without
-// restriction, including without limitation the rights to use,
-// copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following
-// conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-// OTHER DEALINGS IN THE SOFTWARE.
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using JetBrains.Annotations;
-using Microsoft.Extensions.DependencyInjection;
-using Volo.Abp;
-
-namespace Autofac.Extensions.DependencyInjection
-{
- ///
- /// Extension methods on to register the .
- ///
- public static class ServiceCollectionExtensions
- {
- ///
- /// Adds the to the service collection.
- ///
- /// The service collection to add the factory to.
- /// Action on a that adds component registrations to the container.
- /// The service collection.
- public static IServiceCollection AddAutofac(this IServiceCollection services, Action configurationAction = null)
- {
- return services
- .ClearServiceProviderFactories()
- .AddSingleton>(new AutofacServiceProviderFactory(configurationAction));
- }
-
- private static IServiceCollection ClearServiceProviderFactories([NotNull] this IServiceCollection services)
- {
- Check.NotNull(services, nameof(services));
-
- services.RemoveAll(
- service => service.ImplementationInstance?
- .GetType()
- .GetInterfaces()
- .Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IServiceProviderFactory<>)) == true
- );
-
- return services;
- }
- }
-}
diff --git a/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj b/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj
index 9405337b89..3f41412a9e 100644
--- a/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj
+++ b/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj
@@ -12,9 +12,9 @@
-
-
-
+
+
+
diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs
index c3cb34f30c..fc45ccd05d 100644
--- a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs
+++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs
@@ -45,19 +45,26 @@ namespace Volo.Abp.Caching.StackExchangeRedis
MapMetadataMethod = type.GetMethod("MapMetadata", BindingFlags.Instance | BindingFlags.NonPublic);
- GetAbsoluteExpirationMethod = type.GetMethod("GetAbsoluteExpiration", BindingFlags.Static | BindingFlags.NonPublic);
+ GetAbsoluteExpirationMethod =
+ type.GetMethod("GetAbsoluteExpiration", BindingFlags.Static | BindingFlags.NonPublic);
- GetExpirationInSecondsMethod = type.GetMethod("GetExpirationInSeconds", BindingFlags.Static | BindingFlags.NonPublic);
+ GetExpirationInSecondsMethod =
+ type.GetMethod("GetExpirationInSeconds", BindingFlags.Static | BindingFlags.NonPublic);
- SetScript = type.GetField("SetScript", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null).ToString();
+ SetScript = type.GetField("SetScript", BindingFlags.Static | BindingFlags.NonPublic)?.GetValue(null)
+ .ToString();
- AbsoluteExpirationKey = type.GetField("AbsoluteExpirationKey", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null).ToString();
+ AbsoluteExpirationKey = type.GetField("AbsoluteExpirationKey", BindingFlags.Static | BindingFlags.NonPublic)
+ ?.GetValue(null).ToString();
- SlidingExpirationKey = type.GetField("SlidingExpirationKey", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null).ToString();
+ SlidingExpirationKey = type.GetField("SlidingExpirationKey", BindingFlags.Static | BindingFlags.NonPublic)
+ ?.GetValue(null).ToString();
- DataKey = type.GetField("DataKey", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null).ToString();
+ DataKey = type.GetField("DataKey", BindingFlags.Static | BindingFlags.NonPublic)?.GetValue(null).ToString();
- NotPresent = type.GetField("NotPresent", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null).To();
+ // ReSharper disable once PossibleNullReferenceException
+ NotPresent = type.GetField("NotPresent", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null)
+ .To();
}
public AbpRedisCache(IOptions optionsAccessor)
@@ -124,6 +131,42 @@ namespace Volo.Abp.Caching.StackExchangeRedis
await Task.WhenAll(PipelineSetMany(items, options));
}
+ public void RefreshMany(
+ IEnumerable keys)
+ {
+ keys = Check.NotNull(keys, nameof(keys));
+
+ GetAndRefreshMany(keys, false);
+ }
+
+ public async Task RefreshManyAsync(
+ IEnumerable keys,
+ CancellationToken token = default)
+ {
+ keys = Check.NotNull(keys, nameof(keys));
+
+ await GetAndRefreshManyAsync(keys, false, token);
+ }
+
+ public void RemoveMany(IEnumerable keys)
+ {
+ keys = Check.NotNull(keys, nameof(keys));
+
+ Connect();
+
+ RedisDatabase.KeyDelete(keys.Select(key => (RedisKey)(Instance + key)).ToArray());
+ }
+
+ public async Task RemoveManyAsync(IEnumerable keys, CancellationToken token = default)
+ {
+ keys = Check.NotNull(keys, nameof(keys));
+
+ token.ThrowIfCancellationRequested();
+ await ConnectAsync(token);
+
+ await RedisDatabase.KeyDeleteAsync(keys.Select(key => (RedisKey)(Instance + key)).ToArray());
+ }
+
protected virtual byte[][] GetAndRefreshMany(
IEnumerable keys,
bool getData)
diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs
index d62411628e..1337206464 100644
--- a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs
+++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs
@@ -527,6 +527,198 @@ namespace Volo.Abp.Caching
return value;
}
+ public KeyValuePair[] GetOrAddMany(
+ IEnumerable keys,
+ Func, List>> factory,
+ Func optionsFactory = null,
+ bool? hideErrors = null,
+ bool considerUow = false)
+ {
+
+ KeyValuePair[] result;
+ var keyArray = keys.ToArray();
+
+ var cacheSupportsMultipleItems = Cache as ICacheSupportsMultipleItems;
+ if (cacheSupportsMultipleItems == null)
+ {
+ result = GetManyFallback(
+ keyArray,
+ hideErrors,
+ considerUow
+ );
+ }
+ else
+ {
+ var notCachedKeys = new List();
+ var cachedValues = new List>();
+ if (ShouldConsiderUow(considerUow))
+ {
+ var uowCache = GetUnitOfWorkCache();
+ foreach (var key in keyArray)
+ {
+ var value = uowCache.GetOrDefault(key)?.GetUnRemovedValueOrNull();
+ if (value != null)
+ {
+ cachedValues.Add(new KeyValuePair(key, value));
+ }
+ }
+
+ notCachedKeys = keyArray.Except(cachedValues.Select(x => x.Key)).ToList();
+ if (!notCachedKeys.Any())
+ {
+ return cachedValues.ToArray();
+ }
+ }
+
+ hideErrors = hideErrors ?? _distributedCacheOption.HideErrors;
+ byte[][] cachedBytes;
+
+ var readKeys = notCachedKeys.Any() ? notCachedKeys.ToArray() : keyArray;
+ try
+ {
+ cachedBytes = cacheSupportsMultipleItems.GetMany(readKeys.Select(NormalizeKey));
+ }
+ catch (Exception ex)
+ {
+ if (hideErrors == true)
+ {
+ HandleException(ex);
+ return ToCacheItemsWithDefaultValues(keyArray);
+ }
+
+ throw;
+ }
+
+ result = cachedValues.Concat(ToCacheItems(cachedBytes, readKeys)).ToArray();
+ }
+
+ if (result.All(x => x.Value != null))
+ {
+ return result;
+ }
+
+ var missingKeys = new List();
+ var missingValuesIndex = new List();
+ for (var i = 0; i < keyArray.Length; i++)
+ {
+ if (result[i].Value != null)
+ {
+ continue;
+ }
+
+ missingKeys.Add(keyArray[i]);
+ missingValuesIndex.Add(i);
+ }
+
+ var missingValues = factory.Invoke(missingKeys).ToArray();
+ var valueQueue = new Queue>(missingValues);
+
+ SetMany(missingValues, optionsFactory?.Invoke(), hideErrors, considerUow);
+
+ foreach (var index in missingValuesIndex)
+ {
+ result[index] = valueQueue.Dequeue();
+ }
+
+ return result;
+ }
+
+
+ public async Task[]> GetOrAddManyAsync(
+ IEnumerable keys,
+ Func, Task>>> factory,
+ Func optionsFactory = null,
+ bool? hideErrors = null,
+ bool considerUow = false,
+ CancellationToken token = default)
+ {
+ KeyValuePair[] result;
+ var keyArray = keys.ToArray();
+
+ var cacheSupportsMultipleItems = Cache as ICacheSupportsMultipleItems;
+ if (cacheSupportsMultipleItems == null)
+ {
+ result = await GetManyFallbackAsync(
+ keyArray,
+ hideErrors,
+ considerUow, token);
+ }
+ else
+ {
+ var notCachedKeys = new List();
+ var cachedValues = new List>();
+ if (ShouldConsiderUow(considerUow))
+ {
+ var uowCache = GetUnitOfWorkCache();
+ foreach (var key in keyArray)
+ {
+ var value = uowCache.GetOrDefault(key)?.GetUnRemovedValueOrNull();
+ if (value != null)
+ {
+ cachedValues.Add(new KeyValuePair(key, value));
+ }
+ }
+
+ notCachedKeys = keyArray.Except(cachedValues.Select(x => x.Key)).ToList();
+ if (!notCachedKeys.Any())
+ {
+ return cachedValues.ToArray();
+ }
+ }
+
+ hideErrors = hideErrors ?? _distributedCacheOption.HideErrors;
+ byte[][] cachedBytes;
+
+ var readKeys = notCachedKeys.Any() ? notCachedKeys.ToArray() : keyArray;
+ try
+ {
+ cachedBytes = await cacheSupportsMultipleItems.GetManyAsync(readKeys.Select(NormalizeKey), token);
+ }
+ catch (Exception ex)
+ {
+ if (hideErrors == true)
+ {
+ await HandleExceptionAsync(ex);
+ return ToCacheItemsWithDefaultValues(keyArray);
+ }
+
+ throw;
+ }
+
+ result = cachedValues.Concat(ToCacheItems(cachedBytes, readKeys)).ToArray();
+ }
+
+ if (result.All(x => x.Value != null))
+ {
+ return result;
+ }
+
+ var missingKeys = new List();
+ var missingValuesIndex = new List();
+ for (var i = 0; i < keyArray.Length; i++)
+ {
+ if (result[i].Value != null)
+ {
+ continue;
+ }
+
+ missingKeys.Add(keyArray[i]);
+ missingValuesIndex.Add(i);
+ }
+
+ var missingValues = (await factory.Invoke(missingKeys)).ToArray();
+ var valueQueue = new Queue>(missingValues);
+
+ await SetManyAsync(missingValues, optionsFactory?.Invoke(), hideErrors, considerUow, token);
+
+ foreach (var index in missingValuesIndex)
+ {
+ result[index] = valueQueue.Dequeue();
+ }
+
+ return result;
+ }
+
///
/// Sets the cache item value for the provided key.
///
@@ -924,6 +1116,71 @@ namespace Volo.Abp.Caching
}
}
+ public virtual void RefreshMany(
+ IEnumerable keys,
+ bool? hideErrors = null)
+ {
+ hideErrors = hideErrors ?? _distributedCacheOption.HideErrors;
+
+ try
+ {
+ if (Cache is ICacheSupportsMultipleItems cacheSupportsMultipleItems)
+ {
+ cacheSupportsMultipleItems.RefreshMany(keys.Select(NormalizeKey));
+ }
+ else
+ {
+ foreach (var key in keys)
+ {
+ Cache.Refresh(NormalizeKey(key));
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ if (hideErrors == true)
+ {
+ HandleException(ex);
+ return;
+ }
+
+ throw;
+ }
+ }
+
+ public virtual async Task RefreshManyAsync(
+ IEnumerable keys,
+ bool? hideErrors = null,
+ CancellationToken token = default)
+ {
+ hideErrors = hideErrors ?? _distributedCacheOption.HideErrors;
+
+ try
+ {
+ if (Cache is ICacheSupportsMultipleItems cacheSupportsMultipleItems)
+ {
+ await cacheSupportsMultipleItems.RefreshManyAsync(keys.Select(NormalizeKey), token);
+ }
+ else
+ {
+ foreach (var key in keys)
+ {
+ await Cache.RefreshAsync(NormalizeKey(key), token);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ if (hideErrors == true)
+ {
+ await HandleExceptionAsync(ex);
+ return;
+ }
+
+ throw;
+ }
+ }
+
///
/// Removes the cache item for given key from cache.
///
@@ -1027,6 +1284,130 @@ namespace Volo.Abp.Caching
}
}
+ public void RemoveMany(
+ IEnumerable keys,
+ bool? hideErrors = null,
+ bool considerUow = false)
+ {
+ var keyArray = keys.ToArray();
+
+ if (Cache is ICacheSupportsMultipleItems cacheSupportsMultipleItems)
+ {
+ void RemoveRealCache()
+ {
+ hideErrors = hideErrors ?? _distributedCacheOption.HideErrors;
+
+ try
+ {
+ cacheSupportsMultipleItems.RemoveMany(
+ keyArray.Select(NormalizeKey)
+ );
+ }
+ catch (Exception ex)
+ {
+ if (hideErrors == true)
+ {
+ HandleException(ex);
+ return;
+ }
+
+ throw;
+ }
+ }
+
+ if (ShouldConsiderUow(considerUow))
+ {
+ var uowCache = GetUnitOfWorkCache();
+
+ foreach (var key in keyArray)
+ {
+ if (uowCache.TryGetValue(key, out _))
+ {
+ uowCache[key].RemoveValue();
+ }
+ }
+
+ // ReSharper disable once PossibleNullReferenceException
+ UnitOfWorkManager.Current.OnCompleted(() =>
+ {
+ RemoveRealCache();
+ return Task.CompletedTask;
+ });
+ }
+ else
+ {
+ RemoveRealCache();
+ }
+ }
+ else
+ {
+ foreach (var key in keyArray)
+ {
+ Remove(key, hideErrors, considerUow);
+ }
+ }
+ }
+
+ public async Task RemoveManyAsync(
+ IEnumerable keys,
+ bool? hideErrors = null,
+ bool considerUow = false,
+ CancellationToken token = default)
+ {
+ var keyArray = keys.ToArray();
+
+ if (Cache is ICacheSupportsMultipleItems cacheSupportsMultipleItems)
+ {
+ async Task RemoveRealCache()
+ {
+ hideErrors = hideErrors ?? _distributedCacheOption.HideErrors;
+
+ try
+ {
+ await cacheSupportsMultipleItems.RemoveManyAsync(
+ keyArray.Select(NormalizeKey), token);
+ }
+ catch (Exception ex)
+ {
+ if (hideErrors == true)
+ {
+ await HandleExceptionAsync(ex);
+ return;
+ }
+
+ throw;
+ }
+ }
+
+ if (ShouldConsiderUow(considerUow))
+ {
+ var uowCache = GetUnitOfWorkCache();
+
+ foreach (var key in keyArray)
+ {
+ if (uowCache.TryGetValue(key, out _))
+ {
+ uowCache[key].RemoveValue();
+ }
+ }
+
+ // ReSharper disable once PossibleNullReferenceException
+ UnitOfWorkManager.Current.OnCompleted(RemoveRealCache);
+ }
+ else
+ {
+ await RemoveRealCache();
+ }
+ }
+ else
+ {
+ foreach (var key in keyArray)
+ {
+ await RemoveAsync(key, hideErrors, considerUow, token);
+ }
+ }
+ }
+
protected virtual void HandleException(Exception ex)
{
_ = HandleExceptionAsync(ex);
diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/ICacheSupportsMultipleItems.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/ICacheSupportsMultipleItems.cs
index af6f87021b..857385699d 100644
--- a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/ICacheSupportsMultipleItems.cs
+++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/ICacheSupportsMultipleItems.cs
@@ -25,6 +25,24 @@ namespace Volo.Abp.Caching
IEnumerable> items,
DistributedCacheEntryOptions options,
CancellationToken token = default
- );
+ );
+
+ void RefreshMany(
+ IEnumerable keys
+ );
+
+ Task RefreshManyAsync(
+ IEnumerable keys,
+ CancellationToken token = default
+ );
+
+ void RemoveMany(
+ IEnumerable keys
+ );
+
+ Task RemoveManyAsync(
+ IEnumerable keys,
+ CancellationToken token = default
+ );
}
-}
\ No newline at end of file
+}
diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs
index 2f74fd678b..f8e76fd9dd 100644
--- a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs
+++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs
@@ -14,8 +14,8 @@ namespace Volo.Abp.Caching
public interface IDistributedCache : IDistributedCache
where TCacheItem : class
{
-
}
+
///
/// Represents a distributed cache of type.
/// Uses a generic cache key type of type.
@@ -128,6 +128,44 @@ namespace Volo.Abp.Caching
CancellationToken token = default
);
+ ///
+ /// Gets or Adds multiple cache items with the given keys. If any cache items not found for the given keys then adds cache items
+ /// provided by delegate and returns the provided cache items.
+ ///
+ /// The keys of cached items to be retrieved from the cache.
+ /// The factory delegate is used to provide the cache items when no cache items are found for the given .
+ /// The cache options for the factory delegate.
+ /// Indicates to throw or hide the exceptions for the distributed cache.
+ /// This will store the cache in the current unit of work until the end of the current unit of work does not really affect the cache.
+ /// The cache items.
+ KeyValuePair[] GetOrAddMany(
+ IEnumerable keys,
+ Func, List>> factory,
+ Func optionsFactory = null,
+ bool? hideErrors = null,
+ bool considerUow = false
+ );
+
+ ///
+ /// Gets or Adds multiple cache items with the given keys. If any cache items not found for the given keys then adds cache items
+ /// provided by delegate and returns the provided cache items.
+ ///
+ /// The keys of cached items to be retrieved from the cache.
+ /// The factory delegate is used to provide the cache items when no cache items are found for the given .
+ /// The cache options for the factory delegate.
+ /// Indicates to throw or hide the exceptions for the distributed cache.
+ /// This will store the cache in the current unit of work until the end of the current unit of work does not really affect the cache.
+ /// The for the task.
+ /// The cache items.
+ Task[]> GetOrAddManyAsync(
+ IEnumerable keys,
+ Func, Task>>> factory,
+ Func optionsFactory = null,
+ bool? hideErrors = null,
+ bool considerUow = false,
+ CancellationToken token = default
+ );
+
///
/// Sets the cache item value for the provided key.
///
@@ -219,6 +257,29 @@ namespace Volo.Abp.Caching
CancellationToken token = default
);
+ ///
+ /// Refreshes the cache value of the given keys, and resets their sliding expiration timeout.
+ /// Based on the implementation, this can be more efficient than setting multiple items individually.
+ ///
+ /// The keys of cached items to be retrieved from the cache.
+ /// Indicates to throw or hide the exceptions for the distributed cache.
+ void RefreshMany(
+ IEnumerable keys,
+ bool? hideErrors = null);
+
+ ///
+ /// Refreshes the cache value of the given keys, and resets their sliding expiration timeout.
+ /// Based on the implementation, this can be more efficient than setting multiple items individually.
+ ///
+ /// The keys of cached items to be retrieved from the cache.
+ /// Indicates to throw or hide the exceptions for the distributed cache.
+ /// The for the task.
+ /// The indicating that the operation is asynchronous.
+ Task RefreshManyAsync(
+ IEnumerable keys,
+ bool? hideErrors = null,
+ CancellationToken token = default);
+
///
/// Removes the cache item for given key from cache.
///
@@ -245,5 +306,32 @@ namespace Volo.Abp.Caching
bool considerUow = false,
CancellationToken token = default
);
+
+ ///
+ /// Removes the cache items for given keys from cache.
+ ///
+ /// The keys of cached items to be retrieved from the cache.
+ /// Indicates to throw or hide the exceptions for the distributed cache.
+ /// This will store the cache in the current unit of work until the end of the current unit of work does not really affect the cache.
+ void RemoveMany(
+ IEnumerable keys,
+ bool? hideErrors = null,
+ bool considerUow = false
+ );
+
+ ///
+ /// Removes the cache items for given keys from cache.
+ ///
+ /// The keys of cached items to be retrieved from the cache.
+ /// Indicates to throw or hide the exceptions for the distributed cache.
+ /// This will store the cache in the current unit of work until the end of the current unit of work does not really affect the cache.
+ /// The for the task.
+ /// The indicating that the operation is asynchronous.
+ Task RemoveManyAsync(
+ IEnumerable keys,
+ bool? hideErrors = null,
+ bool considerUow = false,
+ CancellationToken token = default
+ );
}
}
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs
index 9208357d4a..6b23857233 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs
@@ -1,5 +1,7 @@
using System.Text;
+using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Cli.Commands;
+using Volo.Abp.Cli.Http;
using Volo.Abp.Domain;
using Volo.Abp.IdentityModel;
using Volo.Abp.Json;
@@ -18,6 +20,9 @@ namespace Volo.Abp.Cli
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
+ context.Services.AddHttpClient(CliConsts.HttpClientName)
+ .ConfigurePrimaryHttpMessageHandler(() => new CliHttpClientHandler());
+
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Configure(options =>
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliConsts.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliConsts.cs
index b062388c7a..37dbbba318 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliConsts.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliConsts.cs
@@ -7,5 +7,7 @@
public const string BranchPrefix = "branch@";
public const string DocsLink = "https://docs.abp.io";
+
+ public const string HttpClientName = "AbpHttpClient";
}
}
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginCommand.cs
index 12810aebb9..f03c101c88 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginCommand.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginCommand.cs
@@ -22,13 +22,17 @@ namespace Volo.Abp.Cli.Commands
public ICancellationTokenProvider CancellationTokenProvider { get; }
public IRemoteServiceExceptionHandler RemoteServiceExceptionHandler { get; }
+ private readonly CliHttpClientFactory _cliHttpClientFactory;
+
public LoginCommand(AuthService authService,
ICancellationTokenProvider cancellationTokenProvider,
- IRemoteServiceExceptionHandler remoteServiceExceptionHandler)
+ IRemoteServiceExceptionHandler remoteServiceExceptionHandler,
+ CliHttpClientFactory cliHttpClientFactory)
{
AuthService = authService;
CancellationTokenProvider = cancellationTokenProvider;
RemoteServiceExceptionHandler = remoteServiceExceptionHandler;
+ _cliHttpClientFactory = cliHttpClientFactory;
Logger = NullLogger.Instance;
}
@@ -79,20 +83,19 @@ namespace Volo.Abp.Cli.Commands
{
var url = $"{CliUrls.WwwAbpIo}api/license/check-multiple-organizations?username={username}";
- using (var client = new CliHttpClient())
+ var client = _cliHttpClientFactory.CreateClient();
+
+ using (var response = await client.GetHttpResponseMessageWithRetryAsync(url, CancellationTokenProvider.Token, Logger))
{
- using (var response = await client.GetHttpResponseMessageWithRetryAsync(url, CancellationTokenProvider.Token, Logger))
+ if (!response.IsSuccessStatusCode)
{
- if (!response.IsSuccessStatusCode)
- {
- throw new Exception($"ERROR: Remote server returns '{response.StatusCode}'");
- }
+ throw new Exception($"ERROR: Remote server returns '{response.StatusCode}'");
+ }
- await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response);
+ await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response);
- var responseContent = await response.Content.ReadAsStringAsync();
- return JsonSerializer.Deserialize(responseContent);
- }
+ var responseContent = await response.Content.ReadAsStringAsync();
+ return JsonSerializer.Deserialize(responseContent);
}
}
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/ConnectionStringProvider.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/ConnectionStringProvider.cs
index 32e09b3339..b0da7f9db0 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/ConnectionStringProvider.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/ConnectionStringProvider.cs
@@ -16,7 +16,7 @@ namespace Volo.Abp.Cli.Commands.Services
case DatabaseManagementSystem.MySQL:
return "Server=localhost;Port=3306;Database=MyProjectName;Uid=root;Pwd=myPassword;";
case DatabaseManagementSystem.PostgreSQL:
- return "User ID=root;Password=myPassword;Host=localhost;Port=5432;Database=MyProjectName;Pooling=true;Min Pool Size=0;Max Pool Size=100;Connection Lifetime=0;";
+ return "Host=localhost;Port=5432;Database=MyProjectName;User ID=root;Password=myPassword;Pooling=true;MinimumPoolSize=0;MaximumPoolSize=100;Connection Lifetime=0;";
//case DatabaseManagementSystem.Oracle:
case DatabaseManagementSystem.OracleDevart:
return "Data Source=MyProjectName;Integrated Security=yes;";
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClient.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClientExtensions.cs
similarity index 73%
rename from framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClient.cs
rename to framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClientExtensions.cs
index d853067abf..9976542f05 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClient.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClientExtensions.cs
@@ -13,29 +13,9 @@ using Microsoft.Extensions.Logging;
namespace Volo.Abp.Cli.Http
{
- public class CliHttpClient : HttpClient
+ public static class CliHttpClientExtensions
{
- public static TimeSpan DefaultTimeout { get; set; } = TimeSpan.FromMinutes(1);
-
- public CliHttpClient(TimeSpan? timeout = null)
- : base(new CliHttpClientHandler())
- {
- Timeout = timeout ?? DefaultTimeout;
-
- AddAuthentication(this);
- }
-
- public CliHttpClient(bool setBearerToken) : base(new CliHttpClientHandler())
- {
- Timeout = DefaultTimeout;
-
- if (setBearerToken)
- {
- AddAuthentication(this);
- }
- }
-
- private static void AddAuthentication(HttpClient client)
+ public static void AddAbpAuthenticationToken(this HttpClient httpClient)
{
if (!AuthService.IsLoggedIn())
{
@@ -45,12 +25,13 @@ namespace Volo.Abp.Cli.Http
var accessToken = File.ReadAllText(CliPaths.AccessToken, Encoding.UTF8);
if (!accessToken.IsNullOrEmpty())
{
- client.SetBearerToken(accessToken);
+ httpClient.SetBearerToken(accessToken);
}
}
- public async Task GetHttpResponseMessageWithRetryAsync
+ public static async Task GetHttpResponseMessageWithRetryAsync
(
+ this HttpClient httpClient,
string url,
CancellationToken? cancellationToken = null,
ILogger logger = null,
@@ -67,7 +48,12 @@ namespace Volo.Abp.Cli.Http
};
}
- cancellationToken ??= CancellationToken.None;
+ if (cancellationToken == null)
+ {
+ var cancellationTokenSource = new CancellationTokenSource();
+ cancellationTokenSource.CancelAfter(httpClient.Timeout);
+ cancellationToken = cancellationTokenSource.Token;
+ }
return await HttpPolicyExtensions
.HandleTransientHttpError()
@@ -92,8 +78,7 @@ namespace Volo.Abp.Cli.Http
$"Waiting {timeSpan.TotalSeconds} secs for the next try...");
}
})
- .ExecuteAsync(async () => await this.GetAsync(url, cancellationToken.Value));
+ .ExecuteAsync(async () => await httpClient.GetAsync(url, cancellationToken.Value));
}
-
}
}
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClientFactory.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClientFactory.cs
new file mode 100644
index 0000000000..a5608a1f88
--- /dev/null
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClientFactory.cs
@@ -0,0 +1,58 @@
+using System;
+using System.Net.Http;
+using System.Threading;
+using Volo.Abp.DependencyInjection;
+using Volo.Abp.Threading;
+
+namespace Volo.Abp.Cli.Http
+{
+ public class CliHttpClientFactory : ISingletonDependency
+ {
+ public static readonly TimeSpan DefaultTimeout = TimeSpan.FromMinutes(1);
+
+ private readonly IHttpClientFactory _clientFactory;
+ private readonly ICancellationTokenProvider _cancellationTokenProvider;
+
+ public CliHttpClientFactory(IHttpClientFactory clientFactory, ICancellationTokenProvider cancellationTokenProvider)
+ {
+ _clientFactory = clientFactory;
+ _cancellationTokenProvider = cancellationTokenProvider;
+ }
+
+ public HttpClient CreateClient(bool needsAuthentication = true, TimeSpan? timeout = null)
+ {
+ var httpClient = _clientFactory.CreateClient(CliConsts.HttpClientName);
+ httpClient.Timeout = timeout ?? DefaultTimeout;
+
+ if (needsAuthentication)
+ {
+ httpClient.AddAbpAuthenticationToken();
+ }
+
+ return httpClient;
+ }
+
+ public CancellationToken GetCancellationToken(TimeSpan? timeout = null)
+ {
+ if (timeout == null)
+ {
+ if (_cancellationTokenProvider == null)
+ {
+ var cancellationTokenSource = new CancellationTokenSource();
+ cancellationTokenSource.CancelAfter(DefaultTimeout);
+ return cancellationTokenSource.Token;
+ }
+ else
+ {
+ return _cancellationTokenProvider.Token;
+ }
+ }
+ else
+ {
+ var cancellationTokenSource = new CancellationTokenSource();
+ cancellationTokenSource.CancelAfter(Convert.ToInt32(timeout.Value.TotalMilliseconds));
+ return cancellationTokenSource.Token;
+ }
+ }
+ }
+}
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/AbpIoApiKeyService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/AbpIoApiKeyService.cs
index 2aeb8ed90a..5ff4d39d4f 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/AbpIoApiKeyService.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/AbpIoApiKeyService.cs
@@ -25,16 +25,19 @@ namespace Volo.Abp.Cli.Licensing
private readonly ILogger _logger;
private DeveloperApiKeyResult _apiKeyResult = null;
+ private readonly CliHttpClientFactory _cliHttpClientFactory;
public AbpIoApiKeyService(
IJsonSerializer jsonSerializer,
ICancellationTokenProvider cancellationTokenProvider,
IRemoteServiceExceptionHandler remoteServiceExceptionHandler,
- ILogger logger)
+ ILogger logger,
+ CliHttpClientFactory cliHttpClientFactory)
{
JsonSerializer = jsonSerializer;
RemoteServiceExceptionHandler = remoteServiceExceptionHandler;
_logger = logger;
+ _cliHttpClientFactory = cliHttpClientFactory;
CancellationTokenProvider = cancellationTokenProvider;
}
@@ -56,22 +59,21 @@ namespace Volo.Abp.Cli.Licensing
}
var url = $"{CliUrls.WwwAbpIo}api/license/api-key";
+ var client = _cliHttpClientFactory.CreateClient();
- using (var client = new CliHttpClient())
+ using (var response = await client.GetHttpResponseMessageWithRetryAsync(url, CancellationTokenProvider.Token, _logger))
{
- using (var response = await client.GetHttpResponseMessageWithRetryAsync(url, CancellationTokenProvider.Token, _logger))
+ if (!response.IsSuccessStatusCode)
{
- if (!response.IsSuccessStatusCode)
- {
- throw new Exception($"ERROR: Remote server returns '{response.StatusCode}'");
- }
+ throw new Exception($"ERROR: Remote server returns '{response.StatusCode}'");
+ }
- await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response);
+ await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response);
- var responseContent = await response.Content.ReadAsStringAsync();
- return JsonSerializer.Deserialize(responseContent);
- }
+ var responseContent = await response.Content.ReadAsStringAsync();
+ return JsonSerializer.Deserialize(responseContent);
}
+
}
}
}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/NuGetService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/NuGetService.cs
index 057ffcc02d..7907baaa2d 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/NuGetService.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/NuGetService.cs
@@ -23,6 +23,7 @@ namespace Volo.Abp.Cli.NuGet
protected ICancellationTokenProvider CancellationTokenProvider { get; }
protected IRemoteServiceExceptionHandler RemoteServiceExceptionHandler { get; }
private readonly IApiKeyService _apiKeyService;
+ private readonly CliHttpClientFactory _cliHttpClientFactory;
private List _proPackageList;
private DeveloperApiKeyResult _apiKeyResult;
@@ -30,12 +31,14 @@ namespace Volo.Abp.Cli.NuGet
IJsonSerializer jsonSerializer,
IRemoteServiceExceptionHandler remoteServiceExceptionHandler,
ICancellationTokenProvider cancellationTokenProvider,
- IApiKeyService apiKeyService)
+ IApiKeyService apiKeyService,
+ CliHttpClientFactory cliHttpClientFactory)
{
JsonSerializer = jsonSerializer;
RemoteServiceExceptionHandler = remoteServiceExceptionHandler;
CancellationTokenProvider = cancellationTokenProvider;
_apiKeyService = apiKeyService;
+ _cliHttpClientFactory = cliHttpClientFactory;
Logger = NullLogger.Instance;
}
@@ -93,18 +96,17 @@ namespace Volo.Abp.Cli.NuGet
url = $"https://api.nuget.org/v3-flatcontainer/{packageId.ToLowerInvariant()}/index.json";
}
- using (var client = new CliHttpClient(setBearerToken: false))
+ var client = _cliHttpClientFactory.CreateClient(needsAuthentication: false);
+
+ using (var responseMessage = await client.GetHttpResponseMessageWithRetryAsync(
+ url,
+ cancellationToken: CancellationTokenProvider.Token,
+ logger: Logger
+ ))
{
- using (var responseMessage = await client.GetHttpResponseMessageWithRetryAsync(
- url,
- cancellationToken: CancellationTokenProvider.Token,
- logger: Logger
- ))
- {
- await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(responseMessage);
- var responseContent = await responseMessage.Content.ReadAsStringAsync();
- return JsonSerializer.Deserialize(responseContent).Versions;
- }
+ await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(responseMessage);
+ var responseContent = await responseMessage.Content.ReadAsStringAsync();
+ return JsonSerializer.Deserialize(responseContent).Versions;
}
}
@@ -120,9 +122,8 @@ namespace Volo.Abp.Cli.NuGet
private async Task> GetProPackageListAsync()
{
- using var client = new CliHttpClient();
-
var url = $"{CliUrls.WwwAbpIo}api/app/nugetPackage/proPackageNames";
+ var client = _cliHttpClientFactory.CreateClient(needsAuthentication: true);
using (var responseMessage = await client.GetHttpResponseMessageWithRetryAsync(
url: url,
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs
index 0462920fbb..bebe44542d 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs
@@ -9,6 +9,7 @@ using System.Net.Http;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
+using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Cli.Http;
using Volo.Abp.Cli.ProjectBuilding.Templates.App;
@@ -28,22 +29,23 @@ namespace Volo.Abp.Cli.ProjectBuilding
public ILogger Logger { get; set; }
protected AbpCliOptions Options { get; }
-
protected IJsonSerializer JsonSerializer { get; }
-
protected IRemoteServiceExceptionHandler RemoteServiceExceptionHandler { get; }
-
protected ICancellationTokenProvider CancellationTokenProvider { get; }
+ private readonly CliHttpClientFactory _cliHttpClientFactory;
+
public AbpIoSourceCodeStore(
IOptions options,
IJsonSerializer jsonSerializer,
IRemoteServiceExceptionHandler remoteServiceExceptionHandler,
- ICancellationTokenProvider cancellationTokenProvider)
+ ICancellationTokenProvider cancellationTokenProvider,
+ CliHttpClientFactory cliHttpClientFactory)
{
JsonSerializer = jsonSerializer;
RemoteServiceExceptionHandler = remoteServiceExceptionHandler;
CancellationTokenProvider = cancellationTokenProvider;
+ _cliHttpClientFactory = cliHttpClientFactory;
Options = options.Value;
Logger = NullLogger.Instance;
@@ -134,24 +136,17 @@ namespace Volo.Abp.Cli.ProjectBuilding
try
{
- using (var client = new CliHttpClient(TimeSpan.FromMinutes(10)))
+ var client = _cliHttpClientFactory.CreateClient();
+ var stringContent = new StringContent(
+ JsonSerializer.Serialize(new GetLatestSourceCodeVersionDto { Name = name, IncludePreReleases = includePreReleases }),
+ Encoding.UTF8,
+ MimeTypes.Application.Json
+ );
+
+ using (var response = await client.PostAsync(url, stringContent, _cliHttpClientFactory.GetCancellationToken(TimeSpan.FromMinutes(10))))
{
- var response = await client.PostAsync(
- url,
- new StringContent(
- JsonSerializer.Serialize(
- new GetLatestSourceCodeVersionDto { Name = name, IncludePreReleases = includePreReleases }
- ),
- Encoding.UTF8,
- MimeTypes.Application.Json
- ),
- CancellationTokenProvider.Token
- );
-
await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response);
-
var result = await response.Content.ReadAsStringAsync();
-
return JsonSerializer.Deserialize(result).Version;
}
}
@@ -164,32 +159,25 @@ namespace Volo.Abp.Cli.ProjectBuilding
private async Task GetTemplateNugetVersionAsync(string name, string type, string version)
{
- var url = $"{CliUrls.WwwAbpIo}api/download/{type}/get-nuget-version/";
-
try
{
- using (var client = new CliHttpClient(TimeSpan.FromMinutes(10)))
- {
- var response = await client.PostAsync(
- url,
- new StringContent(
- JsonSerializer.Serialize(
- new GetTemplateNugetVersionDto { Name = name, Version = version}
- ),
- Encoding.UTF8,
- MimeTypes.Application.Json
- ),
- CancellationTokenProvider.Token
- );
+ var url = $"{CliUrls.WwwAbpIo}api/download/{type}/get-nuget-version/";
+ var client = _cliHttpClientFactory.CreateClient();
- await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response);
+ var stringContent = new StringContent(
+ JsonSerializer.Serialize(new GetTemplateNugetVersionDto { Name = name, Version = version }),
+ Encoding.UTF8,
+ MimeTypes.Application.Json
+ );
+ using (var response = await client.PostAsync(url, stringContent, _cliHttpClientFactory.GetCancellationToken(TimeSpan.FromMinutes(10))))
+ {
+ await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response);
var result = await response.Content.ReadAsStringAsync();
-
return JsonSerializer.Deserialize(result).Version;
}
}
- catch (Exception ex)
+ catch (Exception)
{
return null;
}
@@ -199,38 +187,39 @@ namespace Volo.Abp.Cli.ProjectBuilding
{
var url = $"{CliUrls.WwwAbpIo}api/download/{input.Type}/";
+ HttpResponseMessage responseMessage = null;
+
try
{
- using (var client = new CliHttpClient(TimeSpan.FromMinutes(10)))
- {
- HttpResponseMessage responseMessage;
+ var client = _cliHttpClientFactory.CreateClient();
- if (input.TemplateSource.IsNullOrWhiteSpace())
- {
- responseMessage = await client.PostAsync(
- url,
- new StringContent(JsonSerializer.Serialize(input), Encoding.UTF8, MimeTypes.Application.Json),
- CancellationTokenProvider.Token
- );
- }
- else
- {
- responseMessage = await client.GetAsync(input.TemplateSource, CancellationTokenProvider.Token);
- }
+ if (input.TemplateSource.IsNullOrWhiteSpace())
+ {
+ responseMessage = await client.PostAsync(
+ url,
+ new StringContent(JsonSerializer.Serialize(input), Encoding.UTF8, MimeTypes.Application.Json),
+ _cliHttpClientFactory.GetCancellationToken(TimeSpan.FromMinutes(10))
+ );
+ }
+ else
+ {
+ responseMessage = await client.GetAsync(input.TemplateSource, _cliHttpClientFactory.GetCancellationToken());
+ }
- await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(responseMessage);
+ await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(responseMessage);
+ var resultAsBytes = await responseMessage.Content.ReadAsByteArrayAsync();
+ responseMessage.Dispose();
- return await responseMessage.Content.ReadAsByteArrayAsync();
- }
+ return resultAsBytes;
}
catch (Exception ex)
{
- Console.WriteLine("Error occured while downloading source-code from {0} : {1}", url, ex.Message);
+ Console.WriteLine("Error occured while downloading source-code from {0} : {1}{2}{3}", url, responseMessage?.ToString(), Environment.NewLine, ex.Message);
throw;
}
}
- private bool IsNetworkSource(string source)
+ private static bool IsNetworkSource(string source)
{
return source.ToLower().StartsWith("http");
}
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Analyticses/CliAnalyticsCollect.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Analyticses/CliAnalyticsCollect.cs
index 621631af2a..e97d7443d4 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Analyticses/CliAnalyticsCollect.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Analyticses/CliAnalyticsCollect.cs
@@ -18,15 +18,18 @@ namespace Volo.Abp.Cli.ProjectBuilding.Analyticses
private readonly IJsonSerializer _jsonSerializer;
private readonly ILogger _logger;
private readonly IRemoteServiceExceptionHandler _remoteServiceExceptionHandler;
+ private readonly CliHttpClientFactory _cliHttpClientFactory;
public CliAnalyticsCollect(
ICancellationTokenProvider cancellationTokenProvider,
IJsonSerializer jsonSerializer,
- IRemoteServiceExceptionHandler remoteServiceExceptionHandler)
+ IRemoteServiceExceptionHandler remoteServiceExceptionHandler,
+ CliHttpClientFactory cliHttpClientFactory)
{
_cancellationTokenProvider = cancellationTokenProvider;
_jsonSerializer = jsonSerializer;
_remoteServiceExceptionHandler = remoteServiceExceptionHandler;
+ _cliHttpClientFactory = cliHttpClientFactory;
_logger = NullLogger.Instance;
}
@@ -34,32 +37,31 @@ namespace Volo.Abp.Cli.ProjectBuilding.Analyticses
{
var postData = _jsonSerializer.Serialize(input);
var url = $"{CliUrls.WwwAbpIo}api/clianalytics/collect";
-
+
try
{
- using (var client = new CliHttpClient())
- {
- var responseMessage = await client.PostAsync(
- url,
- new StringContent(postData, Encoding.UTF8, MimeTypes.Application.Json),
- _cancellationTokenProvider.Token
- );
+ var client = _cliHttpClientFactory.CreateClient();
- if (!responseMessage.IsSuccessStatusCode)
- {
- var exceptionMessage = "Remote server returns '" + (int)responseMessage.StatusCode + "-" + responseMessage.ReasonPhrase + "'. ";
- var remoteServiceErrorMessage = await _remoteServiceExceptionHandler.GetAbpRemoteServiceErrorAsync(responseMessage);
+ var responseMessage = await client.PostAsync(
+ url,
+ new StringContent(postData, Encoding.UTF8, MimeTypes.Application.Json),
+ _cancellationTokenProvider.Token
+ );
- if (remoteServiceErrorMessage != null)
- {
- exceptionMessage += remoteServiceErrorMessage;
- }
+ if (!responseMessage.IsSuccessStatusCode)
+ {
+ var exceptionMessage = "Remote server returns '" + (int)responseMessage.StatusCode + "-" + responseMessage.ReasonPhrase + "'. ";
+ var remoteServiceErrorMessage = await _remoteServiceExceptionHandler.GetAbpRemoteServiceErrorAsync(responseMessage);
- _logger.LogInformation(exceptionMessage);
+ if (remoteServiceErrorMessage != null)
+ {
+ exceptionMessage += remoteServiceErrorMessage;
}
+
+ _logger.LogInformation(exceptionMessage);
}
}
- catch (Exception ex)
+ catch (Exception)
{
// ignored
}
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ModuleInfo.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ModuleInfo.cs
index 260fbb745f..1d8da0e3b1 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ModuleInfo.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ModuleInfo.cs
@@ -23,5 +23,7 @@
public bool MvcUi { get; set; }
public bool BlazorUi { get; set; }
+
+ public bool IsFreeToActiveLicenseOwners { get; set; }
}
}
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenameStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenameStep.cs
index 611d4d5266..ce2c8c3b2a 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenameStep.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenameStep.cs
@@ -55,11 +55,13 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
{
RenameHelper.RenameAll(_entries, _companyNamePlaceHolder, _companyName);
RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToCamelCase(), _companyName.ToCamelCase());
+ RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToKebabCase(), _companyName.ToKebabCase());
}
else
{
RenameHelper.RenameAll(_entries, _companyNamePlaceHolder + "." + _projectNamePlaceHolder, _projectNamePlaceHolder);
RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToCamelCase() + "." + _projectNamePlaceHolder.ToCamelCase(), _projectNamePlaceHolder.ToCamelCase());
+ RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToKebabCase() + "/" + _projectNamePlaceHolder.ToKebabCase(), _projectNamePlaceHolder.ToKebabCase());
}
}
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ModuleInfoProvider.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ModuleInfoProvider.cs
index 81bc704151..92bbe728c0 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ModuleInfoProvider.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ModuleInfoProvider.cs
@@ -16,14 +16,18 @@ namespace Volo.Abp.Cli.ProjectBuilding
public ICancellationTokenProvider CancellationTokenProvider { get; }
public IRemoteServiceExceptionHandler RemoteServiceExceptionHandler { get; }
+ private readonly CliHttpClientFactory _cliHttpClientFactory;
+
public ModuleInfoProvider(
IJsonSerializer jsonSerializer,
ICancellationTokenProvider cancellationTokenProvider,
- IRemoteServiceExceptionHandler remoteServiceExceptionHandler)
+ IRemoteServiceExceptionHandler remoteServiceExceptionHandler,
+ CliHttpClientFactory cliHttpClientFactory)
{
JsonSerializer = jsonSerializer;
CancellationTokenProvider = cancellationTokenProvider;
RemoteServiceExceptionHandler = remoteServiceExceptionHandler;
+ _cliHttpClientFactory = cliHttpClientFactory;
}
public async Task GetAsync(string name)
@@ -47,17 +51,16 @@ namespace Volo.Abp.Cli.ProjectBuilding
private async Task> GetModuleListInternalAsync()
{
- using (var client = new CliHttpClient())
+ var client = _cliHttpClientFactory.CreateClient();
+
+ using (var responseMessage = await client.GetAsync(
+ $"{CliUrls.WwwAbpIo}api/download/modules/",
+ CancellationTokenProvider.Token
+ ))
{
- using (var responseMessage = await client.GetAsync(
- $"{CliUrls.WwwAbpIo}api/download/modules/",
- CancellationTokenProvider.Token
- ))
- {
- await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(responseMessage);
- var result = await responseMessage.Content.ReadAsStringAsync();
- return JsonSerializer.Deserialize>(result);
- }
+ await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(responseMessage);
+ var result = await responseMessage.Content.ReadAsStringAsync();
+ return JsonSerializer.Deserialize>(result);
}
}
}
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs
index b9308dd707..1a4bf3c05a 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs
@@ -24,13 +24,17 @@ namespace Volo.Abp.Cli.ProjectBuilding
public IRemoteServiceExceptionHandler RemoteServiceExceptionHandler { get; }
public AuthService AuthService { get; }
+ private readonly CliHttpClientFactory _cliHttpClientFactory;
+
public TemplateInfoProvider(ICancellationTokenProvider cancellationTokenProvider,
IRemoteServiceExceptionHandler remoteServiceExceptionHandler,
- AuthService authService)
+ AuthService authService,
+ CliHttpClientFactory cliHttpClientFactory)
{
CancellationTokenProvider = cancellationTokenProvider;
RemoteServiceExceptionHandler = remoteServiceExceptionHandler;
AuthService = authService;
+ _cliHttpClientFactory = cliHttpClientFactory;
Logger = NullLogger.Instance;
}
@@ -76,21 +80,19 @@ namespace Volo.Abp.Cli.ProjectBuilding
try
{
var url = $"{CliUrls.WwwAbpIo}api/license/check-user";
+ var client = _cliHttpClientFactory.CreateClient();
- using (var client = new CliHttpClient())
+ using (var response = await client.GetHttpResponseMessageWithRetryAsync(url, CancellationTokenProvider.Token, Logger))
{
- using (var response = await client.GetHttpResponseMessageWithRetryAsync(url, CancellationTokenProvider.Token, Logger))
+ if (!response.IsSuccessStatusCode)
{
- if (!response.IsSuccessStatusCode)
- {
- throw new Exception($"ERROR: Remote server returns '{response.StatusCode}'");
- }
+ throw new Exception($"ERROR: Remote server returns '{response.StatusCode}'");
+ }
- await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response);
+ await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response);
- var responseContent = await response.Content.ReadAsStringAsync();
- return JsonSerializer.Deserialize(responseContent);
- }
+ var responseContent = await response.Content.ReadAsStringAsync();
+ return JsonSerializer.Deserialize(responseContent);
}
}
catch (Exception)
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/MyGetPackageListFinder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/MyGetPackageListFinder.cs
index 75e9156ce0..5434ede83f 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/MyGetPackageListFinder.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/MyGetPackageListFinder.cs
@@ -6,17 +6,23 @@ using Microsoft.Extensions.Logging.Abstractions;
using Newtonsoft.Json;
using Volo.Abp.Cli.Http;
using Volo.Abp.DependencyInjection;
+using Volo.Abp.Threading;
namespace Volo.Abp.Cli.ProjectModification
{
public class MyGetPackageListFinder : ISingletonDependency
{
- private MyGetApiResponse _response;
-
public ILogger Logger { get; set; }
- public MyGetPackageListFinder()
+ private MyGetApiResponse _response;
+ private readonly CliHttpClientFactory _cliHttpClientFactory;
+ protected ICancellationTokenProvider CancellationTokenProvider { get; }
+
+ public MyGetPackageListFinder(CliHttpClientFactory cliHttpClientFactory,
+ ICancellationTokenProvider cancellationTokenProvider)
{
+ _cliHttpClientFactory = cliHttpClientFactory;
+ CancellationTokenProvider = cancellationTokenProvider;
Logger = NullLogger.Instance;
}
@@ -29,18 +35,20 @@ namespace Volo.Abp.Cli.ProjectModification
try
{
- using (var client = new CliHttpClient(TimeSpan.FromMinutes(10)))
+ var client = _cliHttpClientFactory.CreateClient();
+
+ using (var responseMessage = await client.GetAsync(
+ $"{CliUrls.WwwAbpIo}api/myget/packages/",
+ _cliHttpClientFactory.GetCancellationToken(TimeSpan.FromMinutes(10))))
{
- var responseMessage = await client.GetAsync(
- $"{CliUrls.WwwAbpIo}api/myget/packages/"
+ _response = JsonConvert.DeserializeObject(
+ Encoding.Default.GetString(await responseMessage.Content.ReadAsByteArrayAsync())
);
-
- _response = JsonConvert.DeserializeObject(Encoding.Default.GetString(await responseMessage.Content.ReadAsByteArrayAsync()));
}
}
- catch (Exception)
+ catch (Exception ex)
{
- Logger.LogError("Unable to get latest preview version.");
+ Logger.LogError("Unable to get latest preview version. Error: " + ex.Message);
throw;
}
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs
index 8fc800c146..bf23bc3786 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs
@@ -27,15 +27,18 @@ namespace Volo.Abp.Cli.ProjectModification
private readonly PackageJsonFileFinder _packageJsonFileFinder;
private readonly NpmGlobalPackagesChecker _npmGlobalPackagesChecker;
private readonly Dictionary _fileVersionStorage = new Dictionary();
+ private readonly CliHttpClientFactory _cliHttpClientFactory;
public NpmPackagesUpdater(
PackageJsonFileFinder packageJsonFileFinder,
NpmGlobalPackagesChecker npmGlobalPackagesChecker,
- ICancellationTokenProvider cancellationTokenProvider)
+ ICancellationTokenProvider cancellationTokenProvider,
+ CliHttpClientFactory cliHttpClientFactory)
{
_packageJsonFileFinder = packageJsonFileFinder;
_npmGlobalPackagesChecker = npmGlobalPackagesChecker;
CancellationTokenProvider = cancellationTokenProvider;
+ _cliHttpClientFactory = cliHttpClientFactory;
Logger = NullLogger.Instance;
}
@@ -151,16 +154,14 @@ namespace Volo.Abp.Cli.ProjectModification
{
try
{
- using (var client = new CliHttpClient(TimeSpan.FromMinutes(1)))
+ var client = _cliHttpClientFactory.CreateClient();
+ using (var response = await client.GetHttpResponseMessageWithRetryAsync(
+ url: $"{CliUrls.WwwAbpIo}api/myget/apikey/",
+ cancellationToken: CancellationTokenProvider.Token,
+ logger: Logger
+ ))
{
- using (var response = await client.GetHttpResponseMessageWithRetryAsync(
- url: $"{CliUrls.WwwAbpIo}api/myget/apikey/",
- cancellationToken: CancellationTokenProvider.Token,
- logger: Logger
- ))
- {
- return Encoding.Default.GetString(await response.Content.ReadAsByteArrayAsync());
- }
+ return Encoding.Default.GetString(await response.Content.ReadAsByteArrayAsync());
}
}
catch (Exception)
@@ -356,7 +357,7 @@ namespace Volo.Abp.Cli.ProjectModification
protected virtual string ExtractVersions(string output)
{
var arrayStart = output.IndexOf('[');
- return output.Substring(arrayStart, output.IndexOf(']') - arrayStart + 1);
+ return output.Substring(arrayStart, output.IndexOf(']') - arrayStart + 1);
}
protected virtual bool SpecifiedVersionExists(string version, JProperty package)
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NuGetPackageTarget.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NuGetPackageTarget.cs
index 10274f3528..68b6e4fb44 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NuGetPackageTarget.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NuGetPackageTarget.cs
@@ -13,6 +13,7 @@
EntityFrameworkCore = 8,
MongoDB = 9,
SignalR = 10,
- Blazor = 11
+ Blazor = 11,
+ IdentityServer = 12
}
}
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectFinder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectFinder.cs
index 0c02f8cb87..0ac4bb2a51 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectFinder.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectFinder.cs
@@ -22,6 +22,8 @@ namespace Volo.Abp.Cli.ProjectModification
{
case NuGetPackageTarget.Web:
return FindProjectEndsWith(projectFiles, assemblyNames, ".Web");
+ case NuGetPackageTarget.IdentityServer:
+ return FindProjectEndsWith(projectFiles, assemblyNames, ".IdentityServer");
case NuGetPackageTarget.EntityFrameworkCore:
return FindProjectEndsWith(projectFiles, assemblyNames, ".EntityFrameworkCore");
case NuGetPackageTarget.MongoDB:
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNugetPackageAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNugetPackageAdder.cs
index ee736f3aa0..6ebcad2c08 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNugetPackageAdder.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNugetPackageAdder.cs
@@ -21,13 +21,15 @@ namespace Volo.Abp.Cli.ProjectModification
public class ProjectNugetPackageAdder : ITransientDependency
{
public ILogger Logger { get; set; }
+ public BundleCommand BundleCommand { get; }
protected IJsonSerializer JsonSerializer { get; }
protected ProjectNpmPackageAdder NpmPackageAdder { get; }
protected DerivedClassFinder ModuleClassFinder { get; }
protected ModuleClassDependcyAdder ModuleClassDependcyAdder { get; }
protected IRemoteServiceExceptionHandler RemoteServiceExceptionHandler { get; }
- public BundleCommand BundleCommand { get; }
+
+ private readonly CliHttpClientFactory _cliHttpClientFactory;
public ProjectNugetPackageAdder(
IJsonSerializer jsonSerializer,
@@ -35,7 +37,8 @@ namespace Volo.Abp.Cli.ProjectModification
DerivedClassFinder moduleClassFinder,
ModuleClassDependcyAdder moduleClassDependcyAdder,
IRemoteServiceExceptionHandler remoteServiceExceptionHandler,
- BundleCommand bundleCommand)
+ BundleCommand bundleCommand,
+ CliHttpClientFactory cliHttpClientFactory)
{
JsonSerializer = jsonSerializer;
NpmPackageAdder = npmPackageAdder;
@@ -43,6 +46,7 @@ namespace Volo.Abp.Cli.ProjectModification
ModuleClassDependcyAdder = moduleClassDependcyAdder;
RemoteServiceExceptionHandler = remoteServiceExceptionHandler;
BundleCommand = bundleCommand;
+ _cliHttpClientFactory = cliHttpClientFactory;
Logger = NullLogger.Instance;
}
@@ -121,7 +125,7 @@ namespace Volo.Abp.Cli.ProjectModification
private Task AddToCsprojManuallyAsync(string projectFile, NugetPackageInfo package, string version = null)
{
var projectFileContent = File.ReadAllText(projectFile);
- var doc = new XmlDocument() {PreserveWhitespace = true};
+ var doc = new XmlDocument() { PreserveWhitespace = true };
doc.Load(StreamHelper.GenerateStreamFromString(projectFileContent));
var itemGroupNodes = doc.SelectNodes("/Project/ItemGroup");
@@ -162,7 +166,7 @@ namespace Volo.Abp.Cli.ProjectModification
private string GetAbpVersionOrNull(string projectFileContent)
{
- var doc = new XmlDocument() {PreserveWhitespace = true};
+ var doc = new XmlDocument() { PreserveWhitespace = true };
doc.Load(StreamHelper.GenerateStreamFromString(projectFileContent));
@@ -173,12 +177,11 @@ namespace Volo.Abp.Cli.ProjectModification
protected virtual async Task FindNugetPackageInfoAsync(string packageName)
{
- using (var client = new CliHttpClient())
- {
- var url = $"{CliUrls.WwwAbpIo}api/app/nugetPackage/byName/?name=" + packageName;
-
- var response = await client.GetAsync(url);
+ var url = $"{CliUrls.WwwAbpIo}api/app/nugetPackage/byName/?name=" + packageName;
+ var client = _cliHttpClientFactory.CreateClient();
+ using (var response = await client.GetAsync(url, _cliHttpClientFactory.GetCancellationToken()))
+ {
if (!response.IsSuccessStatusCode)
{
if (response.StatusCode == HttpStatusCode.NotFound)
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs
index 90f4ff5d8f..c84713ffcb 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs
@@ -7,7 +7,6 @@ using System.Linq;
using System.Net;
using System.Threading.Tasks;
using Volo.Abp.Cli.Args;
-using Volo.Abp.Cli.Bundling;
using Volo.Abp.Cli.Commands;
using Volo.Abp.Cli.Commands.Services;
using Volo.Abp.Cli.Http;
@@ -22,6 +21,12 @@ namespace Volo.Abp.Cli.ProjectModification
public class SolutionModuleAdder : ITransientDependency
{
public ILogger Logger { get; set; }
+ public SourceCodeDownloadService SourceCodeDownloadService { get; }
+ public SolutionFileModifier SolutionFileModifier { get; }
+ public NugetPackageToLocalReferenceConverter NugetPackageToLocalReferenceConverter { get; }
+ public AngularModuleSourceCodeAdder AngularModuleSourceCodeAdder { get; }
+ public NewCommand NewCommand { get; }
+ public BundleCommand BundleCommand { get; }
protected IJsonSerializer JsonSerializer { get; }
protected ProjectNugetPackageAdder ProjectNugetPackageAdder { get; }
@@ -31,12 +36,9 @@ namespace Volo.Abp.Cli.ProjectModification
protected ProjectNpmPackageAdder ProjectNpmPackageAdder { get; }
protected NpmGlobalPackagesChecker NpmGlobalPackagesChecker { get; }
protected IRemoteServiceExceptionHandler RemoteServiceExceptionHandler { get; }
- public SourceCodeDownloadService SourceCodeDownloadService { get; }
- public SolutionFileModifier SolutionFileModifier { get; }
- public NugetPackageToLocalReferenceConverter NugetPackageToLocalReferenceConverter { get; }
- public AngularModuleSourceCodeAdder AngularModuleSourceCodeAdder { get; }
- public NewCommand NewCommand { get; }
- public BundleCommand BundleCommand { get; }
+
+ private readonly CliHttpClientFactory _cliHttpClientFactory;
+
public SolutionModuleAdder(
IJsonSerializer jsonSerializer,
@@ -52,7 +54,8 @@ namespace Volo.Abp.Cli.ProjectModification
NugetPackageToLocalReferenceConverter nugetPackageToLocalReferenceConverter,
AngularModuleSourceCodeAdder angularModuleSourceCodeAdder,
NewCommand newCommand,
- BundleCommand bundleCommand)
+ BundleCommand bundleCommand,
+ CliHttpClientFactory cliHttpClientFactory)
{
JsonSerializer = jsonSerializer;
ProjectNugetPackageAdder = projectNugetPackageAdder;
@@ -68,6 +71,7 @@ namespace Volo.Abp.Cli.ProjectModification
AngularModuleSourceCodeAdder = angularModuleSourceCodeAdder;
NewCommand = newCommand;
BundleCommand = bundleCommand;
+ _cliHttpClientFactory = cliHttpClientFactory;
Logger = NullLogger.Instance;
}
@@ -131,7 +135,7 @@ namespace Volo.Abp.Cli.ProjectModification
{
var blazorProject = projectFiles.FirstOrDefault(f => f.EndsWith(".Blazor.csproj"));
- if (blazorProject == null || !module.NugetPackages.Any(np=> np.Target == NuGetPackageTarget.Blazor))
+ if (blazorProject == null || !module.NugetPackages.Any(np => np.Target == NuGetPackageTarget.Blazor))
{
return;
}
@@ -171,7 +175,7 @@ namespace Volo.Abp.Cli.ProjectModification
{
await RemoveProjectByTarget(module, moduleSolutionFile, NuGetPackageTarget.EntityFrameworkCore, isProjectTiered);
await RemoveProjectByPostFix(module, moduleSolutionFile, "test", ".EntityFrameworkCore.Tests");
- await ChangeDomainTestReferenceToMongoDB(module, moduleSolutionFile);
+ ChangeDomainTestReferenceToMongoDB(module, moduleSolutionFile);
}
}
@@ -211,7 +215,7 @@ namespace Volo.Abp.Cli.ProjectModification
return;
}
- var projectFolderPath = Directory.GetDirectories(srcPath).FirstOrDefault(d=> d.EndsWith(postFix));
+ var projectFolderPath = Directory.GetDirectories(srcPath).FirstOrDefault(d => d.EndsWith(postFix));
if (projectFolderPath == null)
{
@@ -226,7 +230,7 @@ namespace Volo.Abp.Cli.ProjectModification
}
}
- private async Task ChangeDomainTestReferenceToMongoDB(ModuleWithMastersInfo module, string moduleSolutionFile)
+ private void ChangeDomainTestReferenceToMongoDB(ModuleWithMastersInfo module, string moduleSolutionFile)
{
var testPath = Path.Combine(Path.GetDirectoryName(moduleSolutionFile), "test");
@@ -235,7 +239,7 @@ namespace Volo.Abp.Cli.ProjectModification
return;
}
- var projectFolderPath = Directory.GetDirectories(testPath).FirstOrDefault(d=> d.EndsWith("Domain.Tests"));
+ var projectFolderPath = Directory.GetDirectories(testPath).FirstOrDefault(d => d.EndsWith("Domain.Tests"));
if (projectFolderPath == null)
{
@@ -250,10 +254,10 @@ namespace Volo.Abp.Cli.ProjectModification
return;
}
- File.WriteAllText(csprojFile, File.ReadAllText(csprojFile).Replace("EntityFrameworkCore","MongoDB"));
+ File.WriteAllText(csprojFile, File.ReadAllText(csprojFile).Replace("EntityFrameworkCore", "MongoDB"));
File.WriteAllText(moduleFile, File.ReadAllText(moduleFile)
- .Replace(".EntityFrameworkCore;",".MongoDB;")
- .Replace("EntityFrameworkCoreTestModule","MongoDbTestModule"));
+ .Replace(".EntityFrameworkCore;", ".MongoDB;")
+ .Replace("EntityFrameworkCoreTestModule", "MongoDbTestModule"));
}
private async Task AddAngularPackages(string solutionFilePath, ModuleWithMastersInfo module)
@@ -355,9 +359,9 @@ namespace Volo.Abp.Cli.ProjectModification
);
}
- await DeleteRedundantHostProjects(targetModuleFolder,"app");
- await DeleteRedundantHostProjects(targetModuleFolder,"demo");
- await DeleteRedundantHostProjects(targetModuleFolder,"host");
+ await DeleteRedundantHostProjects(targetModuleFolder, "app");
+ await DeleteRedundantHostProjects(targetModuleFolder, "demo");
+ await DeleteRedundantHostProjects(targetModuleFolder, "host");
if (module.MasterModuleInfos == null)
{
@@ -501,7 +505,7 @@ namespace Volo.Abp.Cli.ProjectModification
}
}
- protected virtual async Task RunMigrator(string[] projectFiles)
+ protected virtual void RunMigrator(string[] projectFiles)
{
var dbMigratorProject = projectFiles.FirstOrDefault(p => p.EndsWith(".DbMigrator.csproj"));
@@ -516,15 +520,14 @@ namespace Volo.Abp.Cli.ProjectModification
{
if (newTemplate || newProTemplate)
{
- return await GetEmptyModuleProjectInfoAsync(moduleName, newProTemplate);
+ return GetEmptyModuleProjectInfo(moduleName, newProTemplate);
}
- using (var client = new CliHttpClient())
- {
- var url = $"{CliUrls.WwwAbpIo}api/app/module/byNameWithDetails/?name=" + moduleName;
-
- var response = await client.GetAsync(url);
+ var url = $"{CliUrls.WwwAbpIo}api/app/module/byNameWithDetails/?name=" + moduleName;
+ var client = _cliHttpClientFactory.CreateClient();
+ using (var response = await client.GetAsync(url, _cliHttpClientFactory.GetCancellationToken()))
+ {
if (!response.IsSuccessStatusCode)
{
if (response.StatusCode == HttpStatusCode.NotFound)
@@ -540,7 +543,7 @@ namespace Volo.Abp.Cli.ProjectModification
}
}
- private async Task GetEmptyModuleProjectInfoAsync(string moduleName,
+ private ModuleWithMastersInfo GetEmptyModuleProjectInfo(string moduleName,
bool newProTemplate = false)
{
var module = new ModuleWithMastersInfo
@@ -625,7 +628,7 @@ namespace Volo.Abp.Cli.ProjectModification
protected virtual async Task IsProjectTiered(string[] projectFiles)
{
return projectFiles.Select(ProjectFileNameHelper.GetAssemblyNameFromProjectPath)
- .Any(p =>p.EndsWith(".HttpApi.Host"))
+ .Any(p => p.EndsWith(".HttpApi.Host"))
&& projectFiles.Select(ProjectFileNameHelper.GetAssemblyNameFromProjectPath)
.Any(p => p.EndsWith(".IdentityServer"));
}
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/CmdHelper.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/CmdHelper.cs
index 819022e672..07b470225a 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/CmdHelper.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/CmdHelper.cs
@@ -1,4 +1,5 @@
using System.Diagnostics;
+using System.IO;
using System.Runtime.InteropServices;
namespace Volo.Abp.Cli.Utils
@@ -103,14 +104,28 @@ namespace Volo.Abp.Cli.Utils
public static string GetFileName()
{
- if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
+ if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+ {
+ //Windows
+ return "cmd.exe";
+ }
+
+ //Linux or OSX
+ if (File.Exists("/bin/bash"))
{
- //TODO: Test this. it should work for both operation systems.
return "/bin/bash";
}
- //Windows default.
- return "cmd.exe";
+ if (File.Exists("/bin/sh"))
+ {
+ return "/bin/sh"; //some Linux distributions like Alpine doesn't have bash
+ }
+
+ throw new AbpException($"Cannot determine shell command for this OS! " +
+ $"Running on OS: {System.Runtime.InteropServices.RuntimeInformation.OSDescription} | " +
+ $"OS Architecture: {System.Runtime.InteropServices.RuntimeInformation.OSArchitecture} | " +
+ $"Framework: {System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription} | " +
+ $"Process Architecture{System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture}");
}
}
}
diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/PlugIns/FolderPlugInSource.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/PlugIns/FolderPlugInSource.cs
index b0544d0338..eb54a19900 100644
--- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/PlugIns/FolderPlugInSource.cs
+++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/PlugIns/FolderPlugInSource.cs
@@ -18,7 +18,7 @@ namespace Volo.Abp.Modularity.PlugIns
public Func Filter { get; set; }
public FolderPlugInSource(
- [NotNull] string folder,
+ [NotNull] string folder,
SearchOption searchOption = SearchOption.TopDirectoryOnly)
{
Check.NotNull(folder, nameof(folder));
@@ -52,7 +52,7 @@ namespace Volo.Abp.Modularity.PlugIns
return modules.ToArray();
}
- private IEnumerable GetAssemblies()
+ private List GetAssemblies()
{
var assemblyFiles = AssemblyHelper.GetAssemblyFiles(Folder, SearchOption);
@@ -61,7 +61,7 @@ namespace Volo.Abp.Modularity.PlugIns
assemblyFiles = assemblyFiles.Where(Filter);
}
- return assemblyFiles.Select(AssemblyLoadContext.Default.LoadFromAssemblyPath);
+ return assemblyFiles.Select(AssemblyLoadContext.Default.LoadFromAssemblyPath).ToList();
}
}
-}
\ No newline at end of file
+}
diff --git a/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDataModule.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDataModule.cs
index 8c9643012e..bc3bc8e5dd 100644
--- a/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDataModule.cs
+++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDataModule.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Options;
using Volo.Abp.Modularity;
using Volo.Abp.ObjectExtending;
using Volo.Abp.Uow;
@@ -27,6 +28,14 @@ namespace Volo.Abp.Data
context.Services.AddSingleton(typeof(IDataFilter<>), typeof(DataFilter<>));
}
+ public override void PostConfigureServices(ServiceConfigurationContext context)
+ {
+ Configure(options =>
+ {
+ options.Databases.RefreshIndexes();
+ });
+ }
+
private static void AutoAddDataSeedContributors(IServiceCollection services)
{
var contributors = new List();
diff --git a/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDatabaseInfo.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDatabaseInfo.cs
new file mode 100644
index 0000000000..4f719a862a
--- /dev/null
+++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDatabaseInfo.cs
@@ -0,0 +1,28 @@
+using System.Collections.Generic;
+
+namespace Volo.Abp.Data
+{
+ public class AbpDatabaseInfo
+ {
+ public string DatabaseName { get; set; }
+
+ ///
+ /// List of connection names mapped to this database.
+ ///
+ public HashSet MappedConnections { get; }
+
+ ///
+ /// Is this database used by tenants. Set this to true if this database
+ /// can't owned by tenants.
+ ///
+ /// Default: true.
+ ///
+ public bool IsUsedByTenants { get; set; } = true;
+
+ internal AbpDatabaseInfo(string databaseName)
+ {
+ DatabaseName = databaseName;
+ MappedConnections = new HashSet();
+ }
+ }
+}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDatabaseInfoDictionary.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDatabaseInfoDictionary.cs
new file mode 100644
index 0000000000..93098d303d
--- /dev/null
+++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDatabaseInfoDictionary.cs
@@ -0,0 +1,58 @@
+using System;
+using System.Collections.Generic;
+using JetBrains.Annotations;
+
+namespace Volo.Abp.Data
+{
+ public class AbpDatabaseInfoDictionary : Dictionary
+ {
+ private Dictionary ConnectionIndex { get; set; }
+
+ public AbpDatabaseInfoDictionary()
+ {
+ ConnectionIndex = new Dictionary();
+ }
+
+ [CanBeNull]
+ public AbpDatabaseInfo GetMappedDatabaseOrNull(string connectionStringName)
+ {
+ return ConnectionIndex.GetOrDefault(connectionStringName);
+ }
+
+ public AbpDatabaseInfoDictionary Configure(string databaseName, Action configureAction)
+ {
+ var databaseInfo = this.GetOrAdd(
+ databaseName,
+ () => new AbpDatabaseInfo(databaseName)
+ );
+
+ configureAction(databaseInfo);
+
+ return this;
+ }
+
+ ///
+ /// This method should be called if this dictionary changes.
+ /// It refreshes indexes for quick access to the connection informations.
+ ///
+ public void RefreshIndexes()
+ {
+ ConnectionIndex = new Dictionary();
+
+ foreach (var databaseInfo in Values)
+ {
+ foreach (var mappedConnection in databaseInfo.MappedConnections)
+ {
+ if (ConnectionIndex.ContainsKey(mappedConnection))
+ {
+ throw new AbpException(
+ $"A connection name can not map to multiple databases: {mappedConnection}."
+ );
+ }
+
+ ConnectionIndex[mappedConnection] = databaseInfo;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDbConnectionOptions.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDbConnectionOptions.cs
index 863bffb743..9f6ad78a69 100644
--- a/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDbConnectionOptions.cs
+++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDbConnectionOptions.cs
@@ -1,12 +1,54 @@
-namespace Volo.Abp.Data
+using System;
+using System.Collections.Generic;
+
+namespace Volo.Abp.Data
{
public class AbpDbConnectionOptions
{
public ConnectionStrings ConnectionStrings { get; set; }
+
+ public AbpDatabaseInfoDictionary Databases { get; set; }
public AbpDbConnectionOptions()
{
ConnectionStrings = new ConnectionStrings();
+ Databases = new AbpDatabaseInfoDictionary();
+ }
+
+ public string GetConnectionStringOrNull(
+ string connectionStringName,
+ bool fallbackToDatabaseMappings = true,
+ bool fallbackToDefault = true)
+ {
+ var connectionString = ConnectionStrings.GetOrDefault(connectionStringName);
+ if (!connectionString.IsNullOrEmpty())
+ {
+ return connectionString;
+ }
+
+ if (fallbackToDatabaseMappings)
+ {
+ var database = Databases.GetMappedDatabaseOrNull(connectionStringName);
+ if (database != null)
+ {
+ connectionString = ConnectionStrings.GetOrDefault(database.DatabaseName);
+ if (!connectionString.IsNullOrEmpty())
+ {
+ return connectionString;
+ }
+ }
+ }
+
+ if (fallbackToDefault)
+ {
+ connectionString = ConnectionStrings.Default;
+ if (!connectionString.IsNullOrWhiteSpace())
+ {
+ return connectionString;
+ }
+ }
+
+ return null;
}
}
}
diff --git a/framework/src/Volo.Abp.Data/Volo/Abp/Data/DefaultConnectionStringResolver.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DefaultConnectionStringResolver.cs
index 4d5ce2fb27..f907cb0cb6 100644
--- a/framework/src/Volo.Abp.Data/Volo/Abp/Data/DefaultConnectionStringResolver.cs
+++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DefaultConnectionStringResolver.cs
@@ -1,5 +1,4 @@
using System;
-using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
@@ -10,7 +9,8 @@ namespace Volo.Abp.Data
{
protected AbpDbConnectionOptions Options { get; }
- public DefaultConnectionStringResolver(IOptionsSnapshot options)
+ public DefaultConnectionStringResolver(
+ IOptionsSnapshot options)
{
Options = options.Value;
}
@@ -28,18 +28,19 @@ namespace Volo.Abp.Data
private string ResolveInternal(string connectionStringName)
{
- //Get module specific value if provided
- if (!connectionStringName.IsNullOrEmpty())
+ if (connectionStringName == null)
{
- var moduleConnString = Options.ConnectionStrings.GetOrDefault(connectionStringName);
- if (!moduleConnString.IsNullOrEmpty())
- {
- return moduleConnString;
- }
+ return Options.ConnectionStrings.Default;
+ }
+
+ var connectionString = Options.GetConnectionStringOrNull(connectionStringName);
+
+ if (!connectionString.IsNullOrEmpty())
+ {
+ return connectionString;
}
- //Get default value
- return Options.ConnectionStrings.Default;
+ return null;
}
}
-}
+}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs
index c7f7230710..dbd46811f2 100644
--- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs
+++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs
@@ -117,25 +117,5 @@ namespace Volo.Abp.DependencyInjection
CustomRepositories[entityType] = repositoryType;
}
-
- public bool ShouldRegisterDefaultRepositoryFor(Type entityType)
- {
- if (!RegisterDefaultRepositories)
- {
- return false;
- }
-
- if (CustomRepositories.ContainsKey(entityType))
- {
- return false;
- }
-
- if (!IncludeAllEntitiesForDefaultRepositories && !typeof(IAggregateRoot).IsAssignableFrom(entityType))
- {
- return false;
- }
-
- return true;
- }
}
}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/EntityHelper.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/EntityHelper.cs
index 5e81e2270d..2f8dd28afc 100644
--- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/EntityHelper.cs
+++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/EntityHelper.cs
@@ -1,7 +1,5 @@
using System;
-using System.Collections.Concurrent;
using System.Collections.Generic;
-using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using JetBrains.Annotations;
@@ -15,6 +13,17 @@ namespace Volo.Abp.Domain.Entities
///
public static class EntityHelper
{
+ public static bool IsMultiTenant()
+ where TEntity : IEntity
+ {
+ return IsMultiTenant(typeof(TEntity));
+ }
+
+ public static bool IsMultiTenant(Type type)
+ {
+ return typeof(IMultiTenant).IsAssignableFrom(type);
+ }
+
public static bool EntityEquals(IEntity entity1, IEntity entity2)
{
if (entity1 == null || entity2 == null)
diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IRepository.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IRepository.cs
index 3bda51bd2e..f1136c4ea2 100644
--- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IRepository.cs
+++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IRepository.cs
@@ -20,8 +20,10 @@ namespace Volo.Abp.Domain.Repositories
{
///
/// Get a single entity by the given .
- /// It returns null if no entity with the given .
+ ///
+ /// It returns null if there is no entity with the given .
/// It throws if there are multiple entities with the given .
+ ///
///
/// A condition to find the entity
/// Set true to include all children of this entity
@@ -34,8 +36,10 @@ namespace Volo.Abp.Domain.Repositories
///
/// Get a single entity by the given .
+ ///
/// It throws if there is no entity with the given .
/// It throws if there are multiple entities with the given .
+ ///
///
/// A condition to filter entities
/// Set true to include all children of this entity
@@ -47,10 +51,11 @@ namespace Volo.Abp.Domain.Repositories
);
///
- /// Deletes many entities by function.
- /// Notice that: All entities fits to given predicate are retrieved and deleted.
- /// This may cause major performance problems if there are too many entities with
- /// given predicate.
+ /// Deletes many entities by the given .
+ ///
+ /// Please note: This may cause major performance problems if there are too many entities returned for a
+ /// given predicate and the database provider doesn't have a way to efficiently delete many entities.
+ ///
///
/// A condition to filter entities
///
@@ -69,4 +74,4 @@ namespace Volo.Abp.Domain.Repositories
where TEntity : class, IEntity
{
}
-}
\ No newline at end of file
+}
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/EntityFrameworkCore/AbpModelBuilderExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/EntityFrameworkCore/AbpModelBuilderExtensions.cs
index 7148cb69bd..1ccfee1506 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/EntityFrameworkCore/AbpModelBuilderExtensions.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/EntityFrameworkCore/AbpModelBuilderExtensions.cs
@@ -1,10 +1,72 @@
using Volo.Abp.EntityFrameworkCore;
+using Volo.Abp.MultiTenancy;
namespace Microsoft.EntityFrameworkCore
{
public static class AbpModelBuilderExtensions
{
private const string ModelDatabaseProviderAnnotationKey = "_Abp_DatabaseProvider";
+ private const string ModelMultiTenancySideAnnotationKey = "_Abp_MultiTenancySide";
+
+ #region MultiTenancySide
+
+ public static void SetMultiTenancySide(
+ this ModelBuilder modelBuilder,
+ MultiTenancySides side)
+ {
+ modelBuilder.Model.SetAnnotation(ModelMultiTenancySideAnnotationKey, side);
+ }
+
+ public static MultiTenancySides GetMultiTenancySide(this ModelBuilder modelBuilder)
+ {
+ var value = modelBuilder.Model[ModelMultiTenancySideAnnotationKey];
+ if (value == null)
+ {
+ return MultiTenancySides.Both;
+ }
+
+ return (MultiTenancySides) value;
+ }
+
+ ///
+ /// Returns true if this is a database schema that is used by the host
+ /// but can also be shared with the tenants.
+ ///
+ public static bool IsHostDatabase(this ModelBuilder modelBuilder)
+ {
+ return modelBuilder.GetMultiTenancySide().HasFlag(MultiTenancySides.Host);
+ }
+
+ ///
+ /// Returns true if this is a database schema that is used by the tenants
+ /// but can also be shared with the host.
+ ///
+ public static bool IsTenantDatabase(this ModelBuilder modelBuilder)
+ {
+ return modelBuilder.GetMultiTenancySide().HasFlag(MultiTenancySides.Tenant);
+ }
+
+ ///
+ /// Returns true if this is a database schema that is only used by the host
+ /// and should not contain tenant-only tables.
+ ///
+ public static bool IsHostOnlyDatabase(this ModelBuilder modelBuilder)
+ {
+ return modelBuilder.GetMultiTenancySide() == MultiTenancySides.Host;
+ }
+
+ ///
+ /// Returns true if this is a database schema that is only used by tenants.
+ /// and should not contain host-only tables.
+ ///
+ public static bool IsTenantOnlyDatabase(this ModelBuilder modelBuilder)
+ {
+ return modelBuilder.GetMultiTenancySide() == MultiTenancySides.Tenant;
+ }
+
+ #endregion
+
+ #region DatabaseProvider
public static void SetDatabaseProvider(
this ModelBuilder modelBuilder,
@@ -61,7 +123,7 @@ namespace Microsoft.EntityFrameworkCore
{
modelBuilder.SetDatabaseProvider(EfCoreDatabaseProvider.InMemory);
}
-
+
public static bool IsUsingInMemory(
this ModelBuilder modelBuilder)
{
@@ -73,7 +135,7 @@ namespace Microsoft.EntityFrameworkCore
{
modelBuilder.SetDatabaseProvider(EfCoreDatabaseProvider.Cosmos);
}
-
+
public static bool IsUsingCosmos(
this ModelBuilder modelBuilder)
{
@@ -85,11 +147,13 @@ namespace Microsoft.EntityFrameworkCore
{
modelBuilder.SetDatabaseProvider(EfCoreDatabaseProvider.Firebird);
}
-
+
public static bool IsUsingFirebird(
this ModelBuilder modelBuilder)
{
return modelBuilder.GetDatabaseProvider() == EfCoreDatabaseProvider.Firebird;
}
+
+ #endregion
}
-}
\ No newline at end of file
+}
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs
index 4ba5457677..d673ff2c28 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs
@@ -13,6 +13,7 @@ using Volo.Abp.Domain.Entities;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.DependencyInjection;
using Volo.Abp.Guids;
+using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Domain.Repositories.EntityFrameworkCore
{
@@ -21,18 +22,42 @@ namespace Volo.Abp.Domain.Repositories.EntityFrameworkCore
where TEntity : class, IEntity
{
[Obsolete("Use GetDbContextAsync() method.")]
- protected virtual TDbContext DbContext => _dbContextProvider.GetDbContext();
+ protected virtual TDbContext DbContext => GetDbContext();
[Obsolete("Use GetDbContextAsync() method.")]
- DbContext IEfCoreRepository.DbContext => DbContext.As();
+ DbContext IEfCoreRepository.DbContext => GetDbContext() as DbContext;
async Task IEfCoreRepository.GetDbContextAsync()
{
return await GetDbContextAsync() as DbContext;
}
+ [Obsolete("Use GetDbContextAsync() method.")]
+ private TDbContext GetDbContext()
+ {
+ // Multi-tenancy unaware entities should always use the host connection string
+ if (!EntityHelper.IsMultiTenant())
+ {
+ using (CurrentTenant.Change(null))
+ {
+ return _dbContextProvider.GetDbContext();
+ }
+ }
+
+ return _dbContextProvider.GetDbContext();
+ }
+
protected virtual Task GetDbContextAsync()
{
+ // Multi-tenancy unaware entities should always use the host connection string
+ if (!EntityHelper.IsMultiTenant())
+ {
+ using (CurrentTenant.Change(null))
+ {
+ return _dbContextProvider.GetDbContextAsync();
+ }
+ }
+
return _dbContextProvider.GetDbContextAsync();
}
@@ -264,10 +289,7 @@ namespace Volo.Abp.Domain.Repositories.EntityFrameworkCore
.Where(predicate)
.ToListAsync(GetCancellationToken(cancellationToken));
- foreach (var entity in entities)
- {
- dbSet.Remove(entity);
- }
+ await DeleteManyAsync(entities, autoSave, cancellationToken);
if (autoSave)
{
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactory.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactory.cs
index 0147de12fb..c0603ec6f1 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactory.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactory.cs
@@ -4,6 +4,7 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.Data;
+using Volo.Abp.MultiTenancy;
namespace Volo.Abp.EntityFrameworkCore.DependencyInjection
{
@@ -86,16 +87,34 @@ namespace Volo.Abp.EntityFrameworkCore.DependencyInjection
}
var connectionStringName = ConnectionStringNameAttribute.GetConnStringName();
-
- //Use DefaultConnectionStringResolver.Resolve when we remove IConnectionStringResolver.Resolve
-#pragma warning disable 618
- var connectionString = serviceProvider.GetRequiredService().Resolve(connectionStringName);
-#pragma warning restore 618
+ var connectionString = ResolveConnectionString(serviceProvider, connectionStringName);
return new DbContextCreationContext(
connectionStringName,
connectionString
);
}
+
+ private static string ResolveConnectionString(
+ IServiceProvider serviceProvider,
+ string connectionStringName)
+ {
+ // Use DefaultConnectionStringResolver.Resolve when we remove IConnectionStringResolver.Resolve
+#pragma warning disable 618
+ var connectionStringResolver = serviceProvider.GetRequiredService();
+ var currentTenant = serviceProvider.GetRequiredService();
+
+ // Multi-tenancy unaware contexts should always use the host connection string
+ if (typeof(TDbContext).IsDefined(typeof(IgnoreMultiTenancyAttribute), false))
+ {
+ using (currentTenant.Change(null))
+ {
+ return connectionStringResolver.Resolve(connectionStringName);
+ }
+ }
+
+ return connectionStringResolver.Resolve(connectionStringName);
+#pragma warning restore 618
+ }
}
}
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreTransactionApi.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreTransactionApi.cs
index 625ba72ee2..ce9afacef1 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreTransactionApi.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreTransactionApi.cs
@@ -48,11 +48,19 @@ namespace Volo.Abp.Uow.EntityFrameworkCore
DbContextTransaction.Dispose();
}
- public Task RollbackAsync(CancellationToken cancellationToken)
+ public async Task RollbackAsync(CancellationToken cancellationToken)
{
- return DbContextTransaction.RollbackAsync(
- CancellationTokenProvider.FallbackToProvider(cancellationToken)
- );
+ await DbContextTransaction.RollbackAsync(CancellationTokenProvider.FallbackToProvider(cancellationToken));
+
+ foreach (var dbContext in AttendedDbContexts)
+ {
+ if (dbContext.As().HasRelationalTransactionManager())
+ {
+ continue; //Relational databases use the shared transaction
+ }
+
+ await dbContext.Database.RollbackTransactionAsync(CancellationTokenProvider.FallbackToProvider(cancellationToken));
+ }
}
}
}
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs
index 49abdced36..89cc69fb74 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs
@@ -9,6 +9,7 @@ using Microsoft.Extensions.Logging.Abstractions;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.DependencyInjection;
+using Volo.Abp.MultiTenancy;
using Volo.Abp.Threading;
namespace Volo.Abp.Uow.EntityFrameworkCore
@@ -23,15 +24,18 @@ namespace Volo.Abp.Uow.EntityFrameworkCore
private readonly IUnitOfWorkManager _unitOfWorkManager;
private readonly IConnectionStringResolver _connectionStringResolver;
private readonly ICancellationTokenProvider _cancellationTokenProvider;
+ private readonly ICurrentTenant _currentTenant;
public UnitOfWorkDbContextProvider(
IUnitOfWorkManager unitOfWorkManager,
IConnectionStringResolver connectionStringResolver,
- ICancellationTokenProvider cancellationTokenProvider)
+ ICancellationTokenProvider cancellationTokenProvider,
+ ICurrentTenant currentTenant)
{
_unitOfWorkManager = unitOfWorkManager;
_connectionStringResolver = connectionStringResolver;
_cancellationTokenProvider = cancellationTokenProvider;
+ _currentTenant = currentTenant;
Logger = NullLogger>.Instance;
}
@@ -57,7 +61,7 @@ namespace Volo.Abp.Uow.EntityFrameworkCore
}
var connectionStringName = ConnectionStringNameAttribute.GetConnStringName();
- var connectionString = _connectionStringResolver.Resolve(connectionStringName);
+ var connectionString = ResolveConnectionString(connectionStringName);
var dbContextKey = $"{typeof(TDbContext).FullName}_{connectionString}";
@@ -79,7 +83,7 @@ namespace Volo.Abp.Uow.EntityFrameworkCore
}
var connectionStringName = ConnectionStringNameAttribute.GetConnStringName();
- var connectionString = await _connectionStringResolver.ResolveAsync(connectionStringName);
+ var connectionString = await ResolveConnectionStringAsync(connectionStringName);
var dbContextKey = $"{typeof(TDbContext).FullName}_{connectionString}";
@@ -187,7 +191,10 @@ namespace Volo.Abp.Uow.EntityFrameworkCore
}
else
{
- dbContext.Database.BeginTransaction(); //TODO: Why not using the new created transaction?
+ /* No need to store the returning IDbContextTransaction for non-relational databases
+ * since EfCoreTransactionApi will handle the commit/rollback over the DbContext instance.
+ */
+ dbContext.Database.BeginTransaction();
}
activeTransaction.AttendedDbContexts.Add(dbContext);
@@ -232,7 +239,10 @@ namespace Volo.Abp.Uow.EntityFrameworkCore
}
else
{
- await dbContext.Database.BeginTransactionAsync(GetCancellationToken()); //TODO: Why not using the new created transaction?
+ /* No need to store the returning IDbContextTransaction for non-relational databases
+ * since EfCoreTransactionApi will handle the commit/rollback over the DbContext instance.
+ */
+ await dbContext.Database.BeginTransactionAsync(GetCancellationToken());
}
activeTransaction.AttendedDbContexts.Add(dbContext);
@@ -241,6 +251,35 @@ namespace Volo.Abp.Uow.EntityFrameworkCore
}
}
+ private async Task ResolveConnectionStringAsync(string connectionStringName)
+ {
+ // Multi-tenancy unaware contexts should always use the host connection string
+ if (typeof(TDbContext).IsDefined(typeof(IgnoreMultiTenancyAttribute), false))
+ {
+ using (_currentTenant.Change(null))
+ {
+ return await _connectionStringResolver.ResolveAsync(connectionStringName);
+ }
+ }
+
+ return await _connectionStringResolver.ResolveAsync(connectionStringName);
+ }
+
+ [Obsolete("Use ResolveConnectionStringAsync method.")]
+ private string ResolveConnectionString(string connectionStringName)
+ {
+ // Multi-tenancy unaware contexts should always use the host connection string
+ if (typeof(TDbContext).IsDefined(typeof(IgnoreMultiTenancyAttribute), false))
+ {
+ using (_currentTenant.Change(null))
+ {
+ return _connectionStringResolver.Resolve(connectionStringName);
+ }
+ }
+
+ return _connectionStringResolver.Resolve(connectionStringName);
+ }
+
protected virtual CancellationToken GetCancellationToken(CancellationToken preferredValue = default)
{
return _cancellationTokenProvider.FallbackToProvider(preferredValue);
diff --git a/framework/src/Volo.Abp.EventBus.Abstractions/FodyWeavers.xml b/framework/src/Volo.Abp.EventBus.Abstractions/FodyWeavers.xml
new file mode 100644
index 0000000000..bc5a74a236
--- /dev/null
+++ b/framework/src/Volo.Abp.EventBus.Abstractions/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/framework/src/Volo.Abp.EventBus.Abstractions/FodyWeavers.xsd b/framework/src/Volo.Abp.EventBus.Abstractions/FodyWeavers.xsd
new file mode 100644
index 0000000000..3f3946e282
--- /dev/null
+++ b/framework/src/Volo.Abp.EventBus.Abstractions/FodyWeavers.xsd
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.
+
+
+
+
+ A comma-separated list of error codes that can be safely ignored in assembly verification.
+
+
+
+
+ 'false' to turn off automatic generation of the XML Schema file.
+
+
+
+
+
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.EventBus.Abstractions/Volo.Abp.EventBus.Abstractions.csproj b/framework/src/Volo.Abp.EventBus.Abstractions/Volo.Abp.EventBus.Abstractions.csproj
new file mode 100644
index 0000000000..ae0cef7f59
--- /dev/null
+++ b/framework/src/Volo.Abp.EventBus.Abstractions/Volo.Abp.EventBus.Abstractions.csproj
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+ netstandard2.0
+
+
+
+
+
+
+
+
diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/Distributed/EtoBase.cs b/framework/src/Volo.Abp.EventBus.Abstractions/Volo/Abp/Domain/Entities/Events/Distributed/EtoBase.cs
similarity index 63%
rename from framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/Distributed/EtoBase.cs
rename to framework/src/Volo.Abp.EventBus.Abstractions/Volo/Abp/Domain/Entities/Events/Distributed/EtoBase.cs
index f574240dc8..c877dccc58 100644
--- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/Distributed/EtoBase.cs
+++ b/framework/src/Volo.Abp.EventBus.Abstractions/Volo/Abp/Domain/Entities/Events/Distributed/EtoBase.cs
@@ -6,11 +6,11 @@ namespace Volo.Abp.Domain.Entities.Events.Distributed
[Serializable]
public abstract class EtoBase
{
- public Dictionary Properties { get; }
+ public Dictionary Properties { get; set; }
protected EtoBase()
{
- Properties = new Dictionary();
+ Properties = new Dictionary();
}
}
}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.EventBus.Abstractions/Volo/Abp/EventBus/Abstractions/AbpEventBusAbstractionsModule.cs b/framework/src/Volo.Abp.EventBus.Abstractions/Volo/Abp/EventBus/Abstractions/AbpEventBusAbstractionsModule.cs
new file mode 100644
index 0000000000..bb9d4585b9
--- /dev/null
+++ b/framework/src/Volo.Abp.EventBus.Abstractions/Volo/Abp/EventBus/Abstractions/AbpEventBusAbstractionsModule.cs
@@ -0,0 +1,9 @@
+using Volo.Abp.Modularity;
+
+namespace Volo.Abp.EventBus.Abstractions
+{
+ public class AbpEventBusAbstractionsModule : AbpModule
+ {
+
+ }
+}
diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/EventNameAttribute.cs b/framework/src/Volo.Abp.EventBus.Abstractions/Volo/Abp/EventBus/EventNameAttribute.cs
similarity index 100%
rename from framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/EventNameAttribute.cs
rename to framework/src/Volo.Abp.EventBus.Abstractions/Volo/Abp/EventBus/EventNameAttribute.cs
diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/GenericEventNameAttribute.cs b/framework/src/Volo.Abp.EventBus.Abstractions/Volo/Abp/EventBus/GenericEventNameAttribute.cs
similarity index 100%
rename from framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/GenericEventNameAttribute.cs
rename to framework/src/Volo.Abp.EventBus.Abstractions/Volo/Abp/EventBus/GenericEventNameAttribute.cs
diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventNameProvider.cs b/framework/src/Volo.Abp.EventBus.Abstractions/Volo/Abp/EventBus/IEventNameProvider.cs
similarity index 100%
rename from framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventNameProvider.cs
rename to framework/src/Volo.Abp.EventBus.Abstractions/Volo/Abp/EventBus/IEventNameProvider.cs
diff --git a/framework/src/Volo.Abp.EventBus/Volo.Abp.EventBus.csproj b/framework/src/Volo.Abp.EventBus/Volo.Abp.EventBus.csproj
index a1799c6673..221454bed3 100644
--- a/framework/src/Volo.Abp.EventBus/Volo.Abp.EventBus.csproj
+++ b/framework/src/Volo.Abp.EventBus/Volo.Abp.EventBus.csproj
@@ -15,7 +15,7 @@
-
+
diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/AbpEventBusModule.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/AbpEventBusModule.cs
index 81c3393a50..eb9c17b129 100644
--- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/AbpEventBusModule.cs
+++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/AbpEventBusModule.cs
@@ -1,6 +1,7 @@
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
+using Volo.Abp.EventBus.Abstractions;
using Volo.Abp.EventBus.Distributed;
using Volo.Abp.EventBus.Local;
using Volo.Abp.Modularity;
@@ -9,7 +10,9 @@ using Volo.Abp.Reflection;
namespace Volo.Abp.EventBus
{
- [DependsOn(typeof(AbpMultiTenancyModule))]
+ [DependsOn(
+ typeof(AbpEventBusAbstractionsModule),
+ typeof(AbpMultiTenancyModule))]
public class AbpEventBusModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs
index 9142118b97..7e90bd4fe7 100644
--- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs
+++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs
@@ -1,24 +1,38 @@
using System;
+using System.Globalization;
using System.Linq;
using System.Net.Http;
+using System.Net.Http.Headers;
using System.Reflection;
using System.Text.Json;
using System.Threading.Tasks;
+using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http.Modeling;
+using Volo.Abp.MultiTenancy;
using Volo.Abp.Threading;
+using Volo.Abp.Tracing;
namespace Volo.Abp.Http.Client.DynamicProxying
{
public class ApiDescriptionFinder : IApiDescriptionFinder, ITransientDependency
{
public ICancellationTokenProvider CancellationTokenProvider { get; set; }
-
protected IApiDescriptionCache Cache { get; }
-
- public ApiDescriptionFinder(IApiDescriptionCache cache)
+ protected AbpCorrelationIdOptions AbpCorrelationIdOptions { get; }
+ protected ICorrelationIdProvider CorrelationIdProvider { get; }
+ protected ICurrentTenant CurrentTenant { get; }
+
+ public ApiDescriptionFinder(
+ IApiDescriptionCache cache,
+ IOptions abpCorrelationIdOptions,
+ ICorrelationIdProvider correlationIdProvider,
+ ICurrentTenant currentTenant)
{
Cache = cache;
+ AbpCorrelationIdOptions = abpCorrelationIdOptions.Value;
+ CorrelationIdProvider = correlationIdProvider;
+ CurrentTenant = currentTenant;
CancellationTokenProvider = NullCancellationTokenProvider.Instance;
}
@@ -71,10 +85,19 @@ namespace Volo.Abp.Http.Client.DynamicProxying
return await Cache.GetAsync(baseUrl, () => GetApiDescriptionFromServerAsync(client, baseUrl));
}
- protected virtual async Task GetApiDescriptionFromServerAsync(HttpClient client, string baseUrl)
+ protected virtual async Task GetApiDescriptionFromServerAsync(
+ HttpClient client,
+ string baseUrl)
{
- var response = await client.GetAsync(
- baseUrl.EnsureEndsWith('/') + "api/abp/api-definition",
+ var requestMessage = new HttpRequestMessage(
+ HttpMethod.Get,
+ baseUrl.EnsureEndsWith('/') + "api/abp/api-definition"
+ );
+
+ AddHeaders(requestMessage);
+
+ var response = await client.SendAsync(
+ requestMessage,
CancellationTokenProvider.Token
);
@@ -93,6 +116,30 @@ namespace Volo.Abp.Http.Client.DynamicProxying
return (ApplicationApiDescriptionModel)result;
}
+ protected virtual void AddHeaders(HttpRequestMessage requestMessage)
+ {
+ //CorrelationId
+ requestMessage.Headers.Add(AbpCorrelationIdOptions.HttpHeaderName, CorrelationIdProvider.Get());
+
+ //TenantId
+ if (CurrentTenant.Id.HasValue)
+ {
+ //TODO: Use AbpAspNetCoreMultiTenancyOptions to get the key
+ requestMessage.Headers.Add(TenantResolverConsts.DefaultTenantKey, CurrentTenant.Id.Value.ToString());
+ }
+
+ //Culture
+ //TODO: Is that the way we want? Couldn't send the culture (not ui culture)
+ var currentCulture = CultureInfo.CurrentUICulture.Name ?? CultureInfo.CurrentCulture.Name;
+ if (!currentCulture.IsNullOrEmpty())
+ {
+ requestMessage.Headers.AcceptLanguage.Add(new StringWithQualityHeaderValue(currentCulture));
+ }
+
+ //X-Requested-With
+ requestMessage.Headers.Add("X-Requested-With", "XMLHttpRequest");
+ }
+
protected virtual bool TypeMatches(MethodParameterApiDescriptionModel actionParameter, ParameterInfo methodParameter)
{
return NormalizeTypeName(actionParameter.TypeAsString) ==
diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs
index dd4a681ba5..136c9e42ef 100644
--- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs
+++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs
@@ -138,7 +138,13 @@ namespace Volo.Abp.Http.Client.DynamicProxying
var client = HttpClientFactory.Create(clientConfig.RemoteServiceName);
- var action = await ApiDescriptionFinder.FindActionAsync(client, remoteServiceConfig.BaseUrl, typeof(TService), invocation.Method);
+ var action = await ApiDescriptionFinder.FindActionAsync(
+ client,
+ remoteServiceConfig.BaseUrl,
+ typeof(TService),
+ invocation.Method
+ );
+
var apiVersion = GetApiVersionInfo(action);
var url = remoteServiceConfig.BaseUrl.EnsureEndsWith('/') + UrlBuilder.GenerateUrlWithParameters(action, invocation.ArgumentsDictionary, apiVersion);
@@ -158,9 +164,11 @@ namespace Volo.Abp.Http.Client.DynamicProxying
)
);
- var response = await client.SendAsync(requestMessage,
+ var response = await client.SendAsync(
+ requestMessage,
HttpCompletionOption.ResponseHeadersRead /*this will buffer only the headers, the content will be used as a stream*/,
- GetCancellationToken());
+ GetCancellationToken()
+ );
if (!response.IsSuccessStatusCode)
{
@@ -198,7 +206,11 @@ namespace Volo.Abp.Http.Client.DynamicProxying
return action.SupportedVersions.Last(); //TODO: Ensure to get the latest version!
}
- protected virtual void AddHeaders(IAbpMethodInvocation invocation, ActionApiDescriptionModel action, HttpRequestMessage requestMessage, ApiVersionInfo apiVersion)
+ protected virtual void AddHeaders(
+ IAbpMethodInvocation invocation,
+ ActionApiDescriptionModel action,
+ HttpRequestMessage requestMessage,
+ ApiVersionInfo apiVersion)
{
//API Version
if (!apiVersion.Version.IsNullOrEmpty())
diff --git a/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/AbpKafkaOptions.cs b/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/AbpKafkaOptions.cs
index 1769d8a076..26d15ce818 100644
--- a/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/AbpKafkaOptions.cs
+++ b/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/AbpKafkaOptions.cs
@@ -9,11 +9,13 @@ namespace Volo.Abp.Kafka
public KafkaConnections Connections { get; }
public Action ConfigureProducer { get; set; }
-
+
public Action ConfigureConsumer { get; set; }
public Action ConfigureTopic { get; set; }
+ public bool ReQueue { get; set; } = true;
+
public AbpKafkaOptions()
{
Connections = new KafkaConnections();
diff --git a/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/KafkaMessageConsumer.cs b/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/KafkaMessageConsumer.cs
index bb7e2d66a3..3b8f022012 100644
--- a/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/KafkaMessageConsumer.cs
+++ b/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/KafkaMessageConsumer.cs
@@ -20,6 +20,8 @@ namespace Volo.Abp.Kafka
protected IConsumerPool ConsumerPool { get; }
+ protected IProducerPool ProducerPool { get; }
+
protected IExceptionNotifier ExceptionNotifier { get; }
protected AbpKafkaOptions Options { get; }
@@ -37,10 +39,12 @@ namespace Volo.Abp.Kafka
public KafkaMessageConsumer(
IConsumerPool consumerPool,
IExceptionNotifier exceptionNotifier,
- IOptions options)
+ IOptions options,
+ IProducerPool producerPool)
{
ConsumerPool = consumerPool;
ExceptionNotifier = exceptionNotifier;
+ ProducerPool = producerPool;
Options = options.Value;
Logger = NullLogger.Instance;
@@ -132,14 +136,29 @@ namespace Volo.Abp.Kafka
{
await callback(consumeResult.Message);
}
-
- Consumer.Commit(consumeResult);
}
catch (Exception ex)
{
+ await RequeueAsync(consumeResult);
+
Logger.LogException(ex);
await ExceptionNotifier.NotifyAsync(ex);
}
+ finally
+ {
+ Consumer.Commit(consumeResult);
+ }
+ }
+
+ protected virtual async Task RequeueAsync(ConsumeResult consumeResult)
+ {
+ if (!Options.ReQueue)
+ {
+ return;
+ }
+
+ var producer = ProducerPool.Get(ConnectionName);
+ await producer.ProduceAsync(consumeResult.Topic, consumeResult.Message);
}
public virtual void Dispose()
diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs
index 8ab6753de3..fd8c5afd16 100644
--- a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs
+++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs
@@ -191,10 +191,7 @@ namespace Volo.Abp.Domain.Repositories.MemoryDb
{
var entities = (await GetQueryableAsync()).Where(predicate).ToList();
- foreach (var entity in entities)
- {
- await DeleteAsync(entity, autoSave, cancellationToken);
- }
+ await DeleteManyAsync(entities, autoSave, cancellationToken);
}
public override async Task InsertAsync(
diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Uow/MemoryDb/UnitOfWorkMemoryDatabaseProvider.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Uow/MemoryDb/UnitOfWorkMemoryDatabaseProvider.cs
index c2c5a1df71..9772bac8a0 100644
--- a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Uow/MemoryDb/UnitOfWorkMemoryDatabaseProvider.cs
+++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Uow/MemoryDb/UnitOfWorkMemoryDatabaseProvider.cs
@@ -3,6 +3,7 @@ using System.Threading.Tasks;
using Volo.Abp.Data;
using Volo.Abp.Domain.Repositories.MemoryDb;
using Volo.Abp.MemoryDb;
+using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Uow.MemoryDb
{
@@ -14,17 +15,20 @@ namespace Volo.Abp.Uow.MemoryDb
private readonly IUnitOfWorkManager _unitOfWorkManager;
private readonly IConnectionStringResolver _connectionStringResolver;
private readonly MemoryDatabaseManager _memoryDatabaseManager;
+ private readonly ICurrentTenant _currentTenant;
public UnitOfWorkMemoryDatabaseProvider(
IUnitOfWorkManager unitOfWorkManager,
IConnectionStringResolver connectionStringResolver,
TMemoryDbContext dbContext,
- MemoryDatabaseManager memoryDatabaseManager)
+ MemoryDatabaseManager memoryDatabaseManager,
+ ICurrentTenant currentTenant)
{
_unitOfWorkManager = unitOfWorkManager;
_connectionStringResolver = connectionStringResolver;
DbContext = dbContext;
_memoryDatabaseManager = memoryDatabaseManager;
+ _currentTenant = currentTenant;
}
public Task GetDbContextAsync()
@@ -72,5 +76,34 @@ namespace Volo.Abp.Uow.MemoryDb
return ((MemoryDbDatabaseApi)databaseApi).Database;
}
+
+ private async Task ResolveConnectionStringAsync()
+ {
+ // Multi-tenancy unaware contexts should always use the host connection string
+ if (typeof(TMemoryDbContext).IsDefined(typeof(IgnoreMultiTenancyAttribute), false))
+ {
+ using (_currentTenant.Change(null))
+ {
+ return await _connectionStringResolver.ResolveAsync();
+ }
+ }
+
+ return await _connectionStringResolver.ResolveAsync();
+ }
+
+ [Obsolete("Use ResolveConnectionStringAsync method.")]
+ private string ResolveConnectionString()
+ {
+ // Multi-tenancy unaware contexts should always use the host connection string
+ if (typeof(TMemoryDbContext).IsDefined(typeof(IgnoreMultiTenancyAttribute), false))
+ {
+ using (_currentTenant.Change(null))
+ {
+ return _connectionStringResolver.Resolve();
+ }
+ }
+
+ return _connectionStringResolver.Resolve();
+ }
}
}
diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs
index 6894dc90a2..e6030246aa 100644
--- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs
+++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs
@@ -52,11 +52,37 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
}
[Obsolete("Use GetDbContextAsync method.")]
- protected virtual TMongoDbContext DbContext => DbContextProvider.GetDbContext();
+ protected virtual TMongoDbContext DbContext => GetDbContext();
+
+ [Obsolete("Use GetDbContextAsync method.")]
+ private TMongoDbContext GetDbContext()
+ {
+ // Multi-tenancy unaware entities should always use the host connection string
+ if (!EntityHelper.IsMultiTenant())
+ {
+ using (CurrentTenant.Change(null))
+ {
+ return DbContextProvider.GetDbContext();
+ }
+ }
+
+ return DbContextProvider.GetDbContext();
+ }
protected Task GetDbContextAsync(CancellationToken cancellationToken = default)
{
- return DbContextProvider.GetDbContextAsync(GetCancellationToken(cancellationToken));
+ cancellationToken = GetCancellationToken(cancellationToken);
+
+ // Multi-tenancy unaware entities should always use the host connection string
+ if (!EntityHelper.IsMultiTenant())
+ {
+ using (CurrentTenant.Change(null))
+ {
+ return DbContextProvider.GetDbContextAsync(cancellationToken);
+ }
+ }
+
+ return DbContextProvider.GetDbContextAsync(cancellationToken);
}
protected IMongoDbContextProvider DbContextProvider { get; }
@@ -83,9 +109,11 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
bool autoSave = false,
CancellationToken cancellationToken = default)
{
+ cancellationToken = GetCancellationToken(cancellationToken);
+
await ApplyAbpConceptsForAddedEntityAsync(entity);
- var dbContext = await GetDbContextAsync(GetCancellationToken(cancellationToken));
+ var dbContext = await GetDbContextAsync(cancellationToken);
var collection = dbContext.Collection();
if (dbContext.SessionHandle != null)
@@ -93,14 +121,14 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
await collection.InsertOneAsync(
dbContext.SessionHandle,
entity,
- cancellationToken: GetCancellationToken(cancellationToken)
+ cancellationToken: cancellationToken
);
}
else
{
await collection.InsertOneAsync(
entity,
- cancellationToken: GetCancellationToken(cancellationToken)
+ cancellationToken: cancellationToken
);
}
@@ -109,6 +137,8 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
public override async Task InsertManyAsync(IEnumerable entities, bool autoSave = false, CancellationToken cancellationToken = default)
{
+ cancellationToken = GetCancellationToken(cancellationToken);
+
var entityArray = entities.ToArray();
foreach (var entity in entityArray)
@@ -116,7 +146,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
await ApplyAbpConceptsForAddedEntityAsync(entity);
}
- var dbContext = await GetDbContextAsync(GetCancellationToken(cancellationToken));
+ var dbContext = await GetDbContextAsync(cancellationToken);
var collection = dbContext.Collection();
if (BulkOperationProvider != null)
@@ -145,6 +175,8 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
bool autoSave = false,
CancellationToken cancellationToken = default)
{
+ cancellationToken = GetCancellationToken(cancellationToken);
+
SetModificationAuditProperties(entity);
if (entity is ISoftDelete softDeleteEntity && softDeleteEntity.IsDeleted)
@@ -162,7 +194,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
var oldConcurrencyStamp = SetNewConcurrencyStamp(entity);
ReplaceOneResult result;
- var dbContext = await GetDbContextAsync(GetCancellationToken(cancellationToken));
+ var dbContext = await GetDbContextAsync(cancellationToken);
var collection = dbContext.Collection();
if (dbContext.SessionHandle != null)
@@ -171,7 +203,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
dbContext.SessionHandle,
CreateEntityFilter(entity, true, oldConcurrencyStamp),
entity,
- cancellationToken: GetCancellationToken(cancellationToken)
+ cancellationToken: cancellationToken
);
}
else
@@ -179,7 +211,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
result = await collection.ReplaceOneAsync(
CreateEntityFilter(entity, true, oldConcurrencyStamp),
entity,
- cancellationToken: GetCancellationToken(cancellationToken)
+ cancellationToken: cancellationToken
);
}
@@ -253,15 +285,18 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
bool autoSave = false,
CancellationToken cancellationToken = default)
{
- await ApplyAbpConceptsForDeletedEntityAsync(entity);
- var oldConcurrencyStamp = SetNewConcurrencyStamp(entity);
+ cancellationToken = GetCancellationToken(cancellationToken);
- var dbContext = await GetDbContextAsync(GetCancellationToken(cancellationToken));
+ var dbContext = await GetDbContextAsync(cancellationToken);
var collection = dbContext.Collection();
- if (entity is ISoftDelete softDeleteEntity && !IsHardDeleted(entity))
+ var oldConcurrencyStamp = SetNewConcurrencyStamp(entity);
+
+ if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)) && !IsHardDeleted(entity))
{
- softDeleteEntity.IsDeleted = true;
+ ((ISoftDelete)entity).IsDeleted = true;
+ await ApplyAbpConceptsForDeletedEntityAsync(entity);
+
ReplaceOneResult result;
if (dbContext.SessionHandle != null)
@@ -270,7 +305,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
dbContext.SessionHandle,
CreateEntityFilter(entity, true, oldConcurrencyStamp),
entity,
- cancellationToken: GetCancellationToken(cancellationToken)
+ cancellationToken: cancellationToken
);
}
else
@@ -278,7 +313,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
result = await collection.ReplaceOneAsync(
CreateEntityFilter(entity, true, oldConcurrencyStamp),
entity,
- cancellationToken: GetCancellationToken(cancellationToken)
+ cancellationToken: cancellationToken
);
}
@@ -289,6 +324,8 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
}
else
{
+ await ApplyAbpConceptsForDeletedEntityAsync(entity);
+
DeleteResult result;
if (dbContext.SessionHandle != null)
@@ -296,14 +333,14 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
result = await collection.DeleteOneAsync(
dbContext.SessionHandle,
CreateEntityFilter(entity, true, oldConcurrencyStamp),
- cancellationToken: GetCancellationToken(cancellationToken)
+ cancellationToken: cancellationToken
);
}
else
{
result = await collection.DeleteOneAsync(
CreateEntityFilter(entity, true, oldConcurrencyStamp),
- GetCancellationToken(cancellationToken)
+ cancellationToken
);
}
@@ -319,55 +356,55 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
bool autoSave = false,
CancellationToken cancellationToken = default)
{
- var softDeletedEntities = new List();
+ cancellationToken = GetCancellationToken(cancellationToken);
+
+ var softDeletedEntities = new Dictionary();
var hardDeletedEntities = new List();
foreach (var entity in entities)
{
- await ApplyAbpConceptsForDeletedEntityAsync(entity);
- SetNewConcurrencyStamp(entity);
-
if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)) && !IsHardDeleted(entity))
{
- softDeletedEntities.Add(entity);
+ ((ISoftDelete)entity).IsDeleted = true;
+
+ softDeletedEntities.Add(entity, SetNewConcurrencyStamp(entity));
}
else
{
hardDeletedEntities.Add(entity);
}
+
+ await ApplyAbpConceptsForDeletedEntityAsync(entity);
}
- var dbContext = await GetDbContextAsync(GetCancellationToken(cancellationToken));
+ var dbContext = await GetDbContextAsync(cancellationToken);
var collection = dbContext.Collection();
if (BulkOperationProvider != null)
{
- await BulkOperationProvider.DeleteManyAsync(this, entities.ToArray(), dbContext.SessionHandle, autoSave, cancellationToken);
+ await BulkOperationProvider.DeleteManyAsync(this, entities, dbContext.SessionHandle, autoSave, cancellationToken);
return;
}
if (softDeletedEntities.Count > 0)
{
- UpdateResult updateResult;
- var softDeleteEntitiesCount = softDeletedEntities.Count;
+ BulkWriteResult updateResult;
+
+ var replaceRequests = new List>(
+ softDeletedEntities.Select(entity => new ReplaceOneModel(
+ CreateEntityFilter(entity.Key, true, entity.Value), entity.Key))
+ );
if (dbContext.SessionHandle != null)
{
- updateResult = await collection.UpdateManyAsync(
- dbContext.SessionHandle,
- CreateEntitiesFilter(softDeletedEntities),
- Builders.Update.Set(x => ((ISoftDelete)x).IsDeleted, true)
- );
+ updateResult = await collection.BulkWriteAsync(dbContext.SessionHandle, replaceRequests, cancellationToken: cancellationToken);
}
else
{
- updateResult = await collection.UpdateManyAsync(
- CreateEntitiesFilter(softDeletedEntities),
- Builders.Update.Set(x => ((ISoftDelete)x).IsDeleted, true)
- );
+ updateResult = await collection.BulkWriteAsync(replaceRequests, cancellationToken: cancellationToken);
}
- if (updateResult.MatchedCount < softDeleteEntitiesCount)
+ if (updateResult.MatchedCount < softDeletedEntities.Count)
{
ThrowOptimisticConcurrencyException();
}
@@ -382,14 +419,14 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
{
deleteResult = await collection.DeleteManyAsync(
dbContext.SessionHandle,
- CreateEntitiesFilter(hardDeletedEntities)
- );
+ CreateEntitiesFilter(hardDeletedEntities),
+ cancellationToken: cancellationToken);
}
else
{
deleteResult = await collection.DeleteManyAsync(
- CreateEntitiesFilter(hardDeletedEntities)
- );
+ CreateEntitiesFilter(hardDeletedEntities),
+ cancellationToken: cancellationToken);
}
if (deleteResult.DeletedCount < hardDeletedEntitiesCount)
@@ -438,10 +475,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
.Where(predicate)
.ToListAsync(cancellationToken);
- foreach (var entity in entities)
- {
- await DeleteAsync(entity, autoSave, cancellationToken);
- }
+ await DeleteManyAsync(entities, autoSave, cancellationToken);
}
[Obsolete("Use GetQueryableAsync method.")]
@@ -460,9 +494,11 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
bool includeDetails = true,
CancellationToken cancellationToken = default)
{
+ cancellationToken = GetCancellationToken(cancellationToken);
+
return await (await GetMongoQueryableAsync(cancellationToken))
.Where(predicate)
- .SingleOrDefaultAsync(GetCancellationToken(cancellationToken));
+ .SingleOrDefaultAsync(cancellationToken);
}
[Obsolete("Use GetMongoQueryableAsync method.")]
@@ -477,6 +513,8 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
public async Task> GetMongoQueryableAsync(CancellationToken cancellationToken = default)
{
+ cancellationToken = GetCancellationToken(cancellationToken);
+
var dbContext = await GetDbContextAsync(cancellationToken);
var collection = dbContext.Collection();
@@ -489,6 +527,8 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
public async Task> GetAggregateAsync(CancellationToken cancellationToken = default)
{
+ cancellationToken = GetCancellationToken(cancellationToken);
+
var dbContext = await GetDbContextAsync(cancellationToken);
var collection = await GetCollectionAsync(cancellationToken);
@@ -671,13 +711,13 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
[Obsolete("This method will be removed in future versions.")]
public IAsyncCursor ToCursor(CancellationToken cancellationToken = new CancellationToken())
{
- return GetMongoQueryable().ToCursor(cancellationToken);
+ return GetMongoQueryable().ToCursor(GetCancellationToken(cancellationToken));
}
[Obsolete("This method will be removed in future versions.")]
public Task> ToCursorAsync(CancellationToken cancellationToken = new CancellationToken())
{
- return GetMongoQueryable().ToCursorAsync(cancellationToken);
+ return GetMongoQueryable().ToCursorAsync(GetCancellationToken(cancellationToken));
}
}
@@ -700,7 +740,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
bool includeDetails = true,
CancellationToken cancellationToken = default)
{
- var entity = await FindAsync(id, includeDetails, cancellationToken);
+ var entity = await FindAsync(id, includeDetails, GetCancellationToken(cancellationToken));
if (entity == null)
{
diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs
index a7c4691f47..684593fb7f 100644
--- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs
+++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs
@@ -8,6 +8,7 @@ using MongoDB.Bson;
using MongoDB.Driver;
using Volo.Abp.Data;
using Volo.Abp.MongoDB;
+using Volo.Abp.MultiTenancy;
using Volo.Abp.Threading;
namespace Volo.Abp.Uow.MongoDB
@@ -20,15 +21,18 @@ namespace Volo.Abp.Uow.MongoDB
private readonly IUnitOfWorkManager _unitOfWorkManager;
private readonly IConnectionStringResolver _connectionStringResolver;
private readonly ICancellationTokenProvider _cancellationTokenProvider;
+ private readonly ICurrentTenant _currentTenant;
public UnitOfWorkMongoDbContextProvider(
IUnitOfWorkManager unitOfWorkManager,
IConnectionStringResolver connectionStringResolver,
- ICancellationTokenProvider cancellationTokenProvider)
+ ICancellationTokenProvider cancellationTokenProvider,
+ ICurrentTenant currentTenant)
{
_unitOfWorkManager = unitOfWorkManager;
_connectionStringResolver = connectionStringResolver;
_cancellationTokenProvider = cancellationTokenProvider;
+ _currentTenant = currentTenant;
Logger = NullLogger>.Instance;
}
@@ -54,7 +58,7 @@ namespace Volo.Abp.Uow.MongoDB
$"A {nameof(IMongoDatabase)} instance can only be created inside a unit of work!");
}
- var connectionString = _connectionStringResolver.Resolve();
+ var connectionString = ResolveConnectionString();
var dbContextKey = $"{typeof(TMongoDbContext).FullName}_{connectionString}";
var mongoUrl = new MongoUrl(connectionString);
@@ -81,7 +85,7 @@ namespace Volo.Abp.Uow.MongoDB
$"A {nameof(IMongoDatabase)} instance can only be created inside a unit of work!");
}
- var connectionString = await _connectionStringResolver.ResolveAsync();
+ var connectionString = await ResolveConnectionStringAsync();
var dbContextKey = $"{typeof(TMongoDbContext).FullName}_{connectionString}";
var mongoUrl = new MongoUrl(connectionString);
@@ -234,6 +238,35 @@ namespace Volo.Abp.Uow.MongoDB
return dbContext;
}
+ private async Task ResolveConnectionStringAsync()
+ {
+ // Multi-tenancy unaware contexts should always use the host connection string
+ if (typeof(TMongoDbContext).IsDefined(typeof(IgnoreMultiTenancyAttribute), false))
+ {
+ using (_currentTenant.Change(null))
+ {
+ return await _connectionStringResolver.ResolveAsync();
+ }
+ }
+
+ return await _connectionStringResolver.ResolveAsync();
+ }
+
+ [Obsolete("Use ResolveConnectionStringAsync method.")]
+ private string ResolveConnectionString()
+ {
+ // Multi-tenancy unaware contexts should always use the host connection string
+ if (typeof(TMongoDbContext).IsDefined(typeof(IgnoreMultiTenancyAttribute), false))
+ {
+ using (_currentTenant.Change(null))
+ {
+ return _connectionStringResolver.Resolve();
+ }
+ }
+
+ return _connectionStringResolver.Resolve();
+ }
+
protected virtual CancellationToken GetCancellationToken(CancellationToken preferredValue = default)
{
return _cancellationTokenProvider.FallbackToProvider(preferredValue);
diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo.Abp.MultiTenancy.csproj b/framework/src/Volo.Abp.MultiTenancy/Volo.Abp.MultiTenancy.csproj
index 951712c7f0..344dbfdec0 100644
--- a/framework/src/Volo.Abp.MultiTenancy/Volo.Abp.MultiTenancy.csproj
+++ b/framework/src/Volo.Abp.MultiTenancy/Volo.Abp.MultiTenancy.csproj
@@ -16,6 +16,7 @@
+
diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AbpMultiTenancyModule.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AbpMultiTenancyModule.cs
index 9dc64ef7f8..c51daf99aa 100644
--- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AbpMultiTenancyModule.cs
+++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AbpMultiTenancyModule.cs
@@ -1,5 +1,6 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Data;
+using Volo.Abp.EventBus.Abstractions;
using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy.ConfigurationStore;
using Volo.Abp.Security;
@@ -10,7 +11,8 @@ namespace Volo.Abp.MultiTenancy
[DependsOn(
typeof(AbpDataModule),
- typeof(AbpSecurityModule)
+ typeof(AbpSecurityModule),
+ typeof(AbpEventBusAbstractionsModule)
)]
public class AbpMultiTenancyModule : AbpModule
{
diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenantConnectionStringResolver.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenantConnectionStringResolver.cs
index 0d82419013..41ba7873ac 100644
--- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenantConnectionStringResolver.cs
+++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenantConnectionStringResolver.cs
@@ -26,105 +26,144 @@ namespace Volo.Abp.MultiTenancy
public override async Task ResolveAsync(string connectionStringName = null)
{
- //No current tenant, fallback to default logic
if (_currentTenant.Id == null)
{
+ //No current tenant, fallback to default logic
return await base.ResolveAsync(connectionStringName);
}
- using (var serviceScope = _serviceProvider.CreateScope())
- {
- var tenantStore = serviceScope
- .ServiceProvider
- .GetRequiredService();
+ var tenant = await FindTenantConfigurationAsync(_currentTenant.Id.Value);
- var tenant = await tenantStore.FindAsync(_currentTenant.Id.Value);
-
- if (tenant?.ConnectionStrings == null)
- {
- return await base.ResolveAsync(connectionStringName);
- }
+ if (tenant == null || tenant.ConnectionStrings.IsNullOrEmpty())
+ {
+ //Tenant has not defined any connection string, fallback to default logic
+ return await base.ResolveAsync(connectionStringName);
+ }
- //Requesting default connection string
- if (connectionStringName == null)
- {
- return tenant.ConnectionStrings.Default ??
- Options.ConnectionStrings.Default;
- }
+ var tenantDefaultConnectionString = tenant.ConnectionStrings.Default;
+
+ //Requesting default connection string...
+ if (connectionStringName == null ||
+ connectionStringName == ConnectionStrings.DefaultConnectionStringName)
+ {
+ //Return tenant's default or global default
+ return !tenantDefaultConnectionString.IsNullOrWhiteSpace()
+ ? tenantDefaultConnectionString
+ : Options.ConnectionStrings.Default;
+ }
- //Requesting specific connection string
- var connString = tenant.ConnectionStrings.GetOrDefault(connectionStringName);
- if (connString != null)
+ //Requesting specific connection string...
+ var connString = tenant.ConnectionStrings.GetOrDefault(connectionStringName);
+ if (!connString.IsNullOrWhiteSpace())
+ {
+ //Found for the tenant
+ return connString;
+ }
+
+ //Fallback to the mapped database for the specific connection string
+ var database = Options.Databases.GetMappedDatabaseOrNull(connectionStringName);
+ if (database != null)
+ {
+ connString = tenant.ConnectionStrings.GetOrDefault(database.DatabaseName);
+ if (!connString.IsNullOrWhiteSpace())
{
+ //Found for the tenant
return connString;
}
+ }
- /* Requested a specific connection string, but it's not specified for the tenant.
- * - If it's specified in options, use it.
- * - If not, use tenant's default conn string.
- */
-
- var connStringInOptions = Options.ConnectionStrings.GetOrDefault(connectionStringName);
- if (connStringInOptions != null)
- {
- return connStringInOptions;
- }
-
- return tenant.ConnectionStrings.Default ??
- Options.ConnectionStrings.Default;
+ //Fallback to tenant's default connection string if available
+ if (!tenantDefaultConnectionString.IsNullOrWhiteSpace())
+ {
+ return tenantDefaultConnectionString;
}
+
+ return await base.ResolveAsync(connectionStringName);
}
[Obsolete("Use ResolveAsync method.")]
public override string Resolve(string connectionStringName = null)
{
- //No current tenant, fallback to default logic
if (_currentTenant.Id == null)
{
+ //No current tenant, fallback to default logic
return base.Resolve(connectionStringName);
}
- using (var serviceScope = _serviceProvider.CreateScope())
+ var tenant = FindTenantConfiguration(_currentTenant.Id.Value);
+
+ if (tenant == null || tenant.ConnectionStrings.IsNullOrEmpty())
{
- var tenantStore = serviceScope
- .ServiceProvider
- .GetRequiredService();
+ //Tenant has not defined any connection string, fallback to default logic
+ return base.Resolve(connectionStringName);
+ }
- var tenant = tenantStore.Find(_currentTenant.Id.Value);
+ var tenantDefaultConnectionString = tenant.ConnectionStrings.Default;
- if (tenant?.ConnectionStrings == null)
- {
- return base.Resolve(connectionStringName);
- }
+ //Requesting default connection string...
+ if (connectionStringName == null ||
+ connectionStringName == ConnectionStrings.DefaultConnectionStringName)
+ {
+ //Return tenant's default or global default
+ return !tenantDefaultConnectionString.IsNullOrWhiteSpace()
+ ? tenantDefaultConnectionString
+ : Options.ConnectionStrings.Default;
+ }
- //Requesting default connection string
- if (connectionStringName == null)
- {
- return tenant.ConnectionStrings.Default ??
- Options.ConnectionStrings.Default;
- }
+ //Requesting specific connection string...
+ var connString = tenant.ConnectionStrings.GetOrDefault(connectionStringName);
+ if (!connString.IsNullOrWhiteSpace())
+ {
+ //Found for the tenant
+ return connString;
+ }
- //Requesting specific connection string
- var connString = tenant.ConnectionStrings.GetOrDefault(connectionStringName);
- if (connString != null)
- {
- return connString;
- }
+ //Fallback to tenant's default connection string if available
+ if (!tenantDefaultConnectionString.IsNullOrWhiteSpace())
+ {
+ return tenantDefaultConnectionString;
+ }
- /* Requested a specific connection string, but it's not specified for the tenant.
- * - If it's specified in options, use it.
- * - If not, use tenant's default conn string.
- */
+ //Try to find the specific connection string for given name
+ var connStringInOptions = Options.ConnectionStrings.GetOrDefault(connectionStringName);
+ if (!connStringInOptions.IsNullOrWhiteSpace())
+ {
+ return connStringInOptions;
+ }
- var connStringInOptions = Options.ConnectionStrings.GetOrDefault(connectionStringName);
- if (connStringInOptions != null)
- {
- return connStringInOptions;
- }
+ //Fallback to the global default connection string
+ var defaultConnectionString = Options.ConnectionStrings.Default;
+ if (!defaultConnectionString.IsNullOrWhiteSpace())
+ {
+ return defaultConnectionString;
+ }
+
+ throw new AbpException("No connection string defined!");
+ }
+
+ protected virtual async Task FindTenantConfigurationAsync(Guid tenantId)
+ {
+ using (var serviceScope = _serviceProvider.CreateScope())
+ {
+ var tenantStore = serviceScope
+ .ServiceProvider
+ .GetRequiredService();
+
+ return await tenantStore.FindAsync(tenantId);
+ }
+ }
+
+ [Obsolete("Use FindTenantConfigurationAsync method.")]
+ protected virtual TenantConfiguration FindTenantConfiguration(Guid tenantId)
+ {
+ using (var serviceScope = _serviceProvider.CreateScope())
+ {
+ var tenantStore = serviceScope
+ .ServiceProvider
+ .GetRequiredService();
- return tenant.ConnectionStrings.Default ??
- Options.ConnectionStrings.Default;
+ return tenantStore.Find(tenantId);
}
}
}
-}
+}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConnectionStringUpdatedEto.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConnectionStringUpdatedEto.cs
new file mode 100644
index 0000000000..022343821b
--- /dev/null
+++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConnectionStringUpdatedEto.cs
@@ -0,0 +1,21 @@
+using System;
+using Volo.Abp.Domain.Entities.Events.Distributed;
+using Volo.Abp.EventBus;
+
+namespace Volo.Abp.MultiTenancy
+{
+ [Serializable]
+ [EventName("abp.multi_tenancy.tenant.connection_string.updated")]
+ public class TenantConnectionStringUpdatedEto : EtoBase
+ {
+ public Guid Id { get; set; }
+
+ public string Name { get; set; }
+
+ public string ConnectionStringName { get; set; }
+
+ public string OldValue { get; set; }
+
+ public string NewValue { get; set; }
+ }
+}
diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantCreatedEto.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantCreatedEto.cs
new file mode 100644
index 0000000000..317995c971
--- /dev/null
+++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantCreatedEto.cs
@@ -0,0 +1,15 @@
+using System;
+using Volo.Abp.Domain.Entities.Events.Distributed;
+using Volo.Abp.EventBus;
+
+namespace Volo.Abp.MultiTenancy
+{
+ [Serializable]
+ [EventName("abp.multi_tenancy.tenant.created")]
+ public class TenantCreatedEto : EtoBase
+ {
+ public Guid Id { get; set; }
+
+ public string Name { get; set; }
+ }
+}
diff --git a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs
index b94663d886..f757efab64 100644
--- a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs
+++ b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs
@@ -191,6 +191,16 @@ namespace Volo.Abp.RabbitMQ
}
catch (Exception ex)
{
+ try
+ {
+ Channel.BasicNack(
+ basicDeliverEventArgs.DeliveryTag,
+ multiple: false,
+ requeue: true
+ );
+ }
+ catch { }
+
Logger.LogException(ex);
await ExceptionNotifier.NotifyAsync(ex);
}
diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/es.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/es.json
index 52402db298..076d4b2517 100644
--- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/es.json
+++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/es.json
@@ -11,7 +11,7 @@
"Close": "Cerrar",
"Save": "Guardar",
"SavingWithThreeDot": "Guardando...",
- "Actions": "Actiones",
+ "Actions": "Acciones",
"Delete": "Borrar",
"Edit": "Editar",
"Refresh": "Actualizar",
@@ -49,4 +49,4 @@
"ItemWillBeDeletedMessage": "Este elemento será borrado",
"ManageYourAccount": "Gestiona tu cuenta"
}
-}
\ No newline at end of file
+}
diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json
index 9812ddc326..1e583b4c57 100644
--- a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json
+++ b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json
@@ -3,7 +3,7 @@
"name": "asp.net",
"private": true,
"dependencies": {
- "@abp/aspnetcore.mvc.ui.theme.shared": "^4.2.0-rc.2",
+ "@abp/aspnetcore.mvc.ui.theme.shared": "^4.2.1",
"highlight.js": "^9.13.1"
},
"devDependencies": {}
diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock
index 2a08d4af29..fd7672cc5e 100644
--- a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock
+++ b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock
@@ -2,30 +2,30 @@
# yarn lockfile v1
-"@abp/aspnetcore.mvc.ui.theme.shared@^4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.2.0-rc.2.tgz#9ff3af53b667e747c06d3f067a0f68a938ac72a8"
- integrity sha512-qsJ6UaUxyOJOHxsqVjlUGhCvQUnbXgGzLvFPJZYLpnWm6ZvE1KAgJnQHL46YSllCDT0meVqHt9byjOCRJUMm9Q==
- dependencies:
- "@abp/aspnetcore.mvc.ui" "~4.2.0-rc.2"
- "@abp/bootstrap" "~4.2.0-rc.2"
- "@abp/bootstrap-datepicker" "~4.2.0-rc.2"
- "@abp/datatables.net-bs4" "~4.2.0-rc.2"
- "@abp/font-awesome" "~4.2.0-rc.2"
- "@abp/jquery-form" "~4.2.0-rc.2"
- "@abp/jquery-validation-unobtrusive" "~4.2.0-rc.2"
- "@abp/lodash" "~4.2.0-rc.2"
- "@abp/luxon" "~4.2.0-rc.2"
- "@abp/malihu-custom-scrollbar-plugin" "~4.2.0-rc.2"
- "@abp/select2" "~4.2.0-rc.2"
- "@abp/sweetalert" "~4.2.0-rc.2"
- "@abp/timeago" "~4.2.0-rc.2"
- "@abp/toastr" "~4.2.0-rc.2"
-
-"@abp/aspnetcore.mvc.ui@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.2.0-rc.2.tgz#726f45c7ff12e69e970fb89b4adfb15502a11576"
- integrity sha512-EzTYQ8XzXIprfK95LyYc1Ci3to3dNlBOSzkkYfYDXkSR5/SyBKckCTd5FL4c7yrs+qBoJMxKWDyWz+pmf6PIJA==
+"@abp/aspnetcore.mvc.ui.theme.shared@^4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.2.1.tgz#18205c13f137dad9876c4153f34273a7c8e69854"
+ integrity sha512-+f54CysWpEKfxjIIjhnTKW0jJ0Rg+wS6yxb9Rg3qxA5iEUkxp3B+NB5wA9rT5YcY9APrwVpiw1miNRmq5ZvFXg==
+ dependencies:
+ "@abp/aspnetcore.mvc.ui" "~4.2.1"
+ "@abp/bootstrap" "~4.2.1"
+ "@abp/bootstrap-datepicker" "~4.2.1"
+ "@abp/datatables.net-bs4" "~4.2.1"
+ "@abp/font-awesome" "~4.2.1"
+ "@abp/jquery-form" "~4.2.1"
+ "@abp/jquery-validation-unobtrusive" "~4.2.1"
+ "@abp/lodash" "~4.2.1"
+ "@abp/luxon" "~4.2.1"
+ "@abp/malihu-custom-scrollbar-plugin" "~4.2.1"
+ "@abp/select2" "~4.2.1"
+ "@abp/sweetalert" "~4.2.1"
+ "@abp/timeago" "~4.2.1"
+ "@abp/toastr" "~4.2.1"
+
+"@abp/aspnetcore.mvc.ui@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.2.1.tgz#2ad368af731678213ff3d8448a3dd30a2f1f66c9"
+ integrity sha512-/a/KDVQ3EuETSSe+KqmsR24w6RWHvaokvmmOjL+tCpFQyeaYAZ88E9pvM5hC9HVR24FCHTiARiXwgMTw2eZFyQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@@ -36,145 +36,145 @@
micromatch "^4.0.2"
path "^0.12.7"
-"@abp/bootstrap-datepicker@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.2.0-rc.2.tgz#f2a6d013321c98f8c9a7533087360fce9a5fd074"
- integrity sha512-n3gLYLL7hHX83gurN5iRkpairrw0oAyg+Bc6SeIbNAdorun9wBJn7IlmvXxGPn1xK5iDKktRSeWJ885fMgkuWg==
+"@abp/bootstrap-datepicker@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.2.1.tgz#87fe913aa6923a39206f4481af3b02309e2cebd5"
+ integrity sha512-35uaM+OBUqsBBIF08NUu7XBVIgwVQIjJard92Px7eR0EJ2AW6f5hNlJQYfPkYVdmkPIpG16qWctICB+L2W3ZKA==
dependencies:
bootstrap-datepicker "^1.9.0"
-"@abp/bootstrap@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.2.0-rc.2.tgz#49250657f667f7553f3c2149fda43f7535de989b"
- integrity sha512-WYdyDQzgFlltxqdYINAMVWjXiiDAx780fTJEd3YKLSzxmVGBfoW4cfFzw8vr/G/EMYrgAPQtrIS+BRlFAJXXGQ==
+"@abp/bootstrap@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.2.1.tgz#12d8b0cddb5fca55888e01644ff49ed7d78069e9"
+ integrity sha512-1Z4atDgHDxesjBh5uPb442NALcUucS2Lt56CaN5UPBXQvAPr72cw4hfKbW08KJ0ab7WME0uCi1vYZFM28/zqTg==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
-"@abp/core@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.2.0-rc.2.tgz#dc18c3b8f294563ba62c000c026f5ceb86030456"
- integrity sha512-YJz4xUwb/mv/Xi/WuPz2SF/LD22P/UJ+psb+35ezOeuj020IAdaunk8LdrU5TfaZqNe5WpGszKMA+jO9ydNuqA==
+"@abp/core@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.2.1.tgz#1e74b0ffbc8c938e8de2f320594637910a09cbab"
+ integrity sha512-EiJSgUytS9Mrv8GZr9pwIzxwlrP82hEcS67cAgDxBc4QOhtMXhGZBMjDBHoIkOt6Db/ua0iPC700w0Utt5kWZQ==
dependencies:
- "@abp/utils" "^4.2.0-rc.2"
+ "@abp/utils" "^4.2.1"
-"@abp/datatables.net-bs4@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.2.0-rc.2.tgz#0d14886aa756ca707dd365b423b40d84c658268e"
- integrity sha512-kX+NrGkisy7IMi+xL69dPaPOYNLBZ4Vp7xCvJqNhdc5Sh6Rn1P0bLvxFKG065mBMfgW8tyFNnN3c5WzwcRFSmg==
+"@abp/datatables.net-bs4@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.2.1.tgz#fa6d711e6af352672879130a931fc2d27e5fd9e7"
+ integrity sha512-T66P74F58n4P5xwfhekriSr66A35okrXw61mlMXqeet8ACtxiM55MhXw89qvsL0qo5qG/a9d9MWPYNmZgXvKSQ==
dependencies:
- "@abp/datatables.net" "~4.2.0-rc.2"
+ "@abp/datatables.net" "~4.2.1"
datatables.net-bs4 "^1.10.21"
-"@abp/datatables.net@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.2.0-rc.2.tgz#a82ac16c1644a92d01ba63bf57e0d3784eb00f2f"
- integrity sha512-bEQ6QSUN65lJ8fK8wOVE16cayDI64EgyVb3qZAzWUncxPyLLa5s5zlDjcQ98D3An+x3tG2CdmEEWjlAgWdaf1g==
+"@abp/datatables.net@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.2.1.tgz#a5f3549b7b581619bbffb398b2172ed7789d0486"
+ integrity sha512-ZxpSW6PhJupjecTC25MEKTdjePvg2xNouqioL9L7V3lPJ6S3fsqNs9QFjFjpv0vltzXMaZgJTSuxilmR6s6piw==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
datatables.net "^1.10.21"
-"@abp/font-awesome@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.2.0-rc.2.tgz#6c72ef7ae00beda565e9836c8214ccf074ea7e4b"
- integrity sha512-bEQPGyVsKV7aQtVwG4UIcG+DMneBD7jcjX3eFqjOlGhQq3ODbNld5IPXHO+JnHDLt5NOzrePQLUzPhsvCIwhGA==
+"@abp/font-awesome@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.2.1.tgz#81d718b08a1f08bf35dd0887f9c6c9f1ea5416ee"
+ integrity sha512-kWAOqN7OtiBA7gd3VLH7pft1A5KYnJGJCn56xoqWIqLyHrSapwI5IMOojRDr+WhQJXk5EGE+rnmqRP51MYo4NQ==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
"@fortawesome/fontawesome-free" "^5.13.0"
-"@abp/jquery-form@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.2.0-rc.2.tgz#a4726794f78cf69dd75c0adda3dca3ed623f02d8"
- integrity sha512-rOGXYTTiQUD2HWTabh0+Ot6LX4PEObd3DW3ikBHZSnfen7W0OgnLdqNaunHYSEV3UUgCAZHaX0wQd4SM0pRMLg==
+"@abp/jquery-form@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.2.1.tgz#bbc21aafd88aa0f89619ce72fbafc917812d15e4"
+ integrity sha512-xnxaaOExhz7/8/P6XGvQuKitpuVjzoZz+r1Kr+W9gVy0dWZcCOfeVi4kdpxDFpqUmQJQJi0tvdVkFHx/hAkB7g==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
jquery-form "^4.3.0"
-"@abp/jquery-validation-unobtrusive@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.2.0-rc.2.tgz#5dee22e1bcbd44bd8e2584d37d79e8313cf615ec"
- integrity sha512-xk56Otr6PG/bED2yJuPo0OhwcgS4FQQXySgPD9e7mlZQcjxZ4LvmRU/btoNoxSHKYUBLKRfEOYOqRTxJhrH0eA==
+"@abp/jquery-validation-unobtrusive@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.2.1.tgz#36681e75e43e8f708bbd5d6e359eefd8dcce86df"
+ integrity sha512-STuVKdSUNjrW3q30GcszgzecHDdPmL3aA0jPsRJr0S2Wp5CQOe0dB7d5xyAnADIL68cPXjZWlz1OyXSQ2LixeQ==
dependencies:
- "@abp/jquery-validation" "~4.2.0-rc.2"
+ "@abp/jquery-validation" "~4.2.1"
jquery-validation-unobtrusive "^3.2.11"
-"@abp/jquery-validation@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.2.0-rc.2.tgz#594b9132d1eafebed60be10d219bc9e8b15f18b6"
- integrity sha512-LkNI3X7gpYYkI3DnCTZ1KIV6ykKMqw6pLZhFvTZz7GliZWE1jHtFos4U6lWe2XnMjnFeVeY6rPFM/1LaamfCKg==
+"@abp/jquery-validation@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.2.1.tgz#209b0acb500ac301bb66b3f04bc18b9c574e2fcf"
+ integrity sha512-g87I0nO7Jk2d4Jt7PlLk/bHu5xQFH4+mbHwH4oRLAzflDhRNtNB+uVF35HK/1shprmSlZt6X+bHz652SEqD81g==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
jquery-validation "^1.19.2"
-"@abp/jquery@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.2.0-rc.2.tgz#146589cbf4397be727d38798d557f3879ae51057"
- integrity sha512-yTYk5rRG3qnRKnA/pSXZNH/+KJcJ2Wo5BUtt3G8oKAe+no0Au1BoCV9j7JNiSnLXkFVWFuRwEZCh+cp6ngACng==
+"@abp/jquery@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.2.1.tgz#b8ed11cbc02d33cdc99cacbaf5089343a0f164c5"
+ integrity sha512-xcoSu/2qc2AEF+dCTNHTCWjAo1dIcohHVPM3Yh36bb+JEcnruYYRokqZc4pzkh0GQamE1eMVGi3QOAmuURtbCg==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
jquery "~3.5.1"
-"@abp/lodash@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.2.0-rc.2.tgz#f0a238991c288f439e2751938a39d434dd7883e7"
- integrity sha512-En9gZD8TDY8ZvZqHVsv3cP2EsRdPRsGD0ncUYOvlNG/sc+MZpRmZ+xOLws1wXS83IxGAxzPdCFEu0biJlyOyxg==
+"@abp/lodash@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.2.1.tgz#87b7f48cf494553f7cd43dddf625a90581555ae7"
+ integrity sha512-hDwzR/Q9GqXPdQaijQ3B4GIWZ8z9clCW9vU59qbELD8xBZIJalTSrUGnIT8YNB9O5tNFb2FWJJbw5Nh8K7lu1A==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
lodash "^4.17.15"
-"@abp/luxon@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.2.0-rc.2.tgz#ace30caacf6abcce1559b65046ea55e47e1cb8a2"
- integrity sha512-ivhOadlaeBh6Pi3S5Bo0pb4EPCEjMFL5N5tZXGGieZt7EnF+4uiXbKJVErXNCDtX1jhJT/3HGqmdxa+WynUE0A==
+"@abp/luxon@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.2.1.tgz#e29c1fe9903beb0fc4d32cab90a5de4ebc768e43"
+ integrity sha512-Sussnocvw75EbJ1j0Ohn7F+SBQy9xPbiG6RJExdDFzxhUNsVp5wJF2Jm8hOZB3DYkeGAOskY5RoIG0abfE/j3w==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
luxon "^1.24.1"
-"@abp/malihu-custom-scrollbar-plugin@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.2.0-rc.2.tgz#483668c09e13b0ebcea16320a16f8517fcdd53ee"
- integrity sha512-IYOwJcWyJkn/gdp4VkEYCv2Gi5+Boxe7pE7hA49gxgllHiFV0ABDFrRg4h8MbyJd80iwvVPo8t8ouvn4Snm+gQ==
+"@abp/malihu-custom-scrollbar-plugin@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.2.1.tgz#0c491d772ab0bb03d7eead0b9715bddb44252d56"
+ integrity sha512-qBnBMzj4G/dAMShmF4EXr55hkMehC1+cB6Jjl1wPHgMV8QPafznBKGyM6KWxGhrl8K6nCErBbidgQKpYqtWhNA==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
malihu-custom-scrollbar-plugin "^3.1.5"
-"@abp/select2@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.2.0-rc.2.tgz#d11e808dac90e09e14025b6ba6dabed683a9b1fb"
- integrity sha512-fENomkoAML+NQWvZ/ecjvqnXtvrzJKyChwj9Ul12c+Noi6boeuFDbhi/OG6qCrSzDnNBrehHVXBLFxT9sIL0OA==
+"@abp/select2@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.2.1.tgz#2f397cc1754135642385333bf47a1a106dd9b165"
+ integrity sha512-g1AUGof5daULbVFCokR9JS1/4gIpEWKB5/+rRJBmnje2hUgBA3llD5PCOh5WRHA7urJJOD/5BjWlFdozluUAyg==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
select2 "^4.0.13"
-"@abp/sweetalert@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.2.0-rc.2.tgz#2359eeb9e4b34c4cbb3aaed11136ea3d280bd677"
- integrity sha512-oQPj2vKPNAOvBECgJFdDwvJ8nwQ54ZPsAW1XS3XSkFz3YwWn4Xt9eZK6vecHloYckSckrFtsN/DSQI8ao/uIFg==
+"@abp/sweetalert@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.2.1.tgz#bdbc28c3f73b314b8ca792ea73390fe9f558c03f"
+ integrity sha512-xTi0oSjAkFMIDHgF8YB+oqFCl4gNfnt7mGHvEjJwpCEQSkuML9QsiGvw1TpXyHP7npOWSjjVpoyEBS2HXC778Q==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
sweetalert "^2.1.2"
-"@abp/timeago@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.2.0-rc.2.tgz#d243acff635978068ec579c83a34d0680616c5ef"
- integrity sha512-TF1dt9ro3BQnfVetDzbOkedSIncSwvPfnHKMY1xcLG2h0c6ke2PjDQ+4QJrtigggT4vfgmQtRrs/zJxjzWS7qw==
+"@abp/timeago@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.2.1.tgz#38474ed4455e94c687a3124e1a6e77c3b29a87d3"
+ integrity sha512-46+2plKizUcRn2VWN5WPWvwEVz+xoKOmsH1tEJ8WKKNxjeNRAsfeOslbfIEks89hTXLQemP3txAbq9V3E8pwQw==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
timeago "^1.6.7"
-"@abp/toastr@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.2.0-rc.2.tgz#4e76f4b7068f92b267b725ad597b8315e6b615bc"
- integrity sha512-UJVuQWc7py54JC35RrH+MwAZsOoOhejxX+3aonz8Io2rgFFj0YwK5U+vItRNM3iabSqTcIExcSD3XL2TmQyVzg==
+"@abp/toastr@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.2.1.tgz#9e30607f7ff7067588d0a660226d338003c37707"
+ integrity sha512-fdlMZjffEO/05aeG8BjTspARKGtUu2SpoFViTeHGhSPsCW55BvuehIgRhyOEQNfMqJz8m0cVR0R2q+WPFWf1XA==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
toastr "^2.1.4"
-"@abp/utils@^4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.2.0-rc.2.tgz#43c27d421da8e58a5d74c0a2df8742efa827c842"
- integrity sha512-6gSLTP9s88aFjxm+fU2iZMzv5Eoe5/va2PHTAoQJA4BaP/SpFRGts3cT4HYWPfAbmzZVZ+tvjuYd3P6d3FCAhw==
+"@abp/utils@^4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.2.1.tgz#1f5bfa7aae0065ec4dc38f1f5dc393b664c92d5c"
+ integrity sha512-V7XYC38u4C+UpXQr28KA1KHL5nNgDsFHfZULPnkwPxV8DuhzemmPYN3qmSXi5hfSfp+psNCX3GYZRMCI57kHgQ==
dependencies:
just-compare "^1.3.0"
diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json
index a87af271a2..5b59cb4e77 100644
--- a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json
+++ b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json
@@ -3,8 +3,8 @@
"name": "asp.net",
"private": true,
"dependencies": {
- "@abp/aspnetcore.mvc.ui.theme.basic": "^4.2.0-rc.2",
- "@abp/prismjs": "^4.2.0-rc.2"
+ "@abp/aspnetcore.mvc.ui.theme.basic": "^4.2.1",
+ "@abp/prismjs": "^4.2.1"
},
"devDependencies": {}
-}
\ No newline at end of file
+}
diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock
index 1c363e7ca2..ab9fe53b89 100644
--- a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock
+++ b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock
@@ -2,37 +2,37 @@
# yarn lockfile v1
-"@abp/aspnetcore.mvc.ui.theme.basic@^4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.2.0-rc.2.tgz#f4625e18fd3704d432913e9de59c7183770ea485"
- integrity sha512-wwOFcrICyhgAcBq7zgdIkYQ8Mov0g1iYrjoRZRiUzBYG4wkcAO9POM9asE6uvY5sD/hd0cRoXSZOcNKUt0J1SA==
- dependencies:
- "@abp/aspnetcore.mvc.ui.theme.shared" "~4.2.0-rc.2"
-
-"@abp/aspnetcore.mvc.ui.theme.shared@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.2.0-rc.2.tgz#9ff3af53b667e747c06d3f067a0f68a938ac72a8"
- integrity sha512-qsJ6UaUxyOJOHxsqVjlUGhCvQUnbXgGzLvFPJZYLpnWm6ZvE1KAgJnQHL46YSllCDT0meVqHt9byjOCRJUMm9Q==
- dependencies:
- "@abp/aspnetcore.mvc.ui" "~4.2.0-rc.2"
- "@abp/bootstrap" "~4.2.0-rc.2"
- "@abp/bootstrap-datepicker" "~4.2.0-rc.2"
- "@abp/datatables.net-bs4" "~4.2.0-rc.2"
- "@abp/font-awesome" "~4.2.0-rc.2"
- "@abp/jquery-form" "~4.2.0-rc.2"
- "@abp/jquery-validation-unobtrusive" "~4.2.0-rc.2"
- "@abp/lodash" "~4.2.0-rc.2"
- "@abp/luxon" "~4.2.0-rc.2"
- "@abp/malihu-custom-scrollbar-plugin" "~4.2.0-rc.2"
- "@abp/select2" "~4.2.0-rc.2"
- "@abp/sweetalert" "~4.2.0-rc.2"
- "@abp/timeago" "~4.2.0-rc.2"
- "@abp/toastr" "~4.2.0-rc.2"
-
-"@abp/aspnetcore.mvc.ui@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.2.0-rc.2.tgz#726f45c7ff12e69e970fb89b4adfb15502a11576"
- integrity sha512-EzTYQ8XzXIprfK95LyYc1Ci3to3dNlBOSzkkYfYDXkSR5/SyBKckCTd5FL4c7yrs+qBoJMxKWDyWz+pmf6PIJA==
+"@abp/aspnetcore.mvc.ui.theme.basic@^4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.2.1.tgz#78b465ab8fcd68a38e2b868717d00e5f5d3b0c61"
+ integrity sha512-Tb0g4mtdSsjQkadvnjjRjObEhweUvigto0BTv5SzRNi0oQLW8ZVUcFmuMWB09nJAIPrbuA3QuPUlXzFcv2gsdg==
+ dependencies:
+ "@abp/aspnetcore.mvc.ui.theme.shared" "~4.2.1"
+
+"@abp/aspnetcore.mvc.ui.theme.shared@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.2.1.tgz#18205c13f137dad9876c4153f34273a7c8e69854"
+ integrity sha512-+f54CysWpEKfxjIIjhnTKW0jJ0Rg+wS6yxb9Rg3qxA5iEUkxp3B+NB5wA9rT5YcY9APrwVpiw1miNRmq5ZvFXg==
+ dependencies:
+ "@abp/aspnetcore.mvc.ui" "~4.2.1"
+ "@abp/bootstrap" "~4.2.1"
+ "@abp/bootstrap-datepicker" "~4.2.1"
+ "@abp/datatables.net-bs4" "~4.2.1"
+ "@abp/font-awesome" "~4.2.1"
+ "@abp/jquery-form" "~4.2.1"
+ "@abp/jquery-validation-unobtrusive" "~4.2.1"
+ "@abp/lodash" "~4.2.1"
+ "@abp/luxon" "~4.2.1"
+ "@abp/malihu-custom-scrollbar-plugin" "~4.2.1"
+ "@abp/select2" "~4.2.1"
+ "@abp/sweetalert" "~4.2.1"
+ "@abp/timeago" "~4.2.1"
+ "@abp/toastr" "~4.2.1"
+
+"@abp/aspnetcore.mvc.ui@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.2.1.tgz#2ad368af731678213ff3d8448a3dd30a2f1f66c9"
+ integrity sha512-/a/KDVQ3EuETSSe+KqmsR24w6RWHvaokvmmOjL+tCpFQyeaYAZ88E9pvM5hC9HVR24FCHTiARiXwgMTw2eZFyQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@@ -43,162 +43,162 @@
micromatch "^4.0.2"
path "^0.12.7"
-"@abp/bootstrap-datepicker@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.2.0-rc.2.tgz#f2a6d013321c98f8c9a7533087360fce9a5fd074"
- integrity sha512-n3gLYLL7hHX83gurN5iRkpairrw0oAyg+Bc6SeIbNAdorun9wBJn7IlmvXxGPn1xK5iDKktRSeWJ885fMgkuWg==
+"@abp/bootstrap-datepicker@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.2.1.tgz#87fe913aa6923a39206f4481af3b02309e2cebd5"
+ integrity sha512-35uaM+OBUqsBBIF08NUu7XBVIgwVQIjJard92Px7eR0EJ2AW6f5hNlJQYfPkYVdmkPIpG16qWctICB+L2W3ZKA==
dependencies:
bootstrap-datepicker "^1.9.0"
-"@abp/bootstrap@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.2.0-rc.2.tgz#49250657f667f7553f3c2149fda43f7535de989b"
- integrity sha512-WYdyDQzgFlltxqdYINAMVWjXiiDAx780fTJEd3YKLSzxmVGBfoW4cfFzw8vr/G/EMYrgAPQtrIS+BRlFAJXXGQ==
+"@abp/bootstrap@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.2.1.tgz#12d8b0cddb5fca55888e01644ff49ed7d78069e9"
+ integrity sha512-1Z4atDgHDxesjBh5uPb442NALcUucS2Lt56CaN5UPBXQvAPr72cw4hfKbW08KJ0ab7WME0uCi1vYZFM28/zqTg==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
-"@abp/clipboard@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-4.2.0-rc.2.tgz#0cda5f6f3624e68e1ec7290517364d02f2b60e42"
- integrity sha512-wF/d8Xuq+ORUkiWgDorM7rxueiygtELaZKlRDYzmQRnwJN4vS1q/4/UtPaLSlcGhHxWuxu2XSWQtzcphfBjFWA==
+"@abp/clipboard@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-4.2.1.tgz#93132b1f3009883da00d074e9ce2a45fdb368fea"
+ integrity sha512-yMbBbiPdm187XtPX0unfdjSTd5Lmh9U527kw/suq0NqFwMEOVQkdW7gA1Xm1Ierit5OwvNP3vE6sHqTk7LhLWw==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
clipboard "^2.0.6"
-"@abp/core@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.2.0-rc.2.tgz#dc18c3b8f294563ba62c000c026f5ceb86030456"
- integrity sha512-YJz4xUwb/mv/Xi/WuPz2SF/LD22P/UJ+psb+35ezOeuj020IAdaunk8LdrU5TfaZqNe5WpGszKMA+jO9ydNuqA==
+"@abp/core@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.2.1.tgz#1e74b0ffbc8c938e8de2f320594637910a09cbab"
+ integrity sha512-EiJSgUytS9Mrv8GZr9pwIzxwlrP82hEcS67cAgDxBc4QOhtMXhGZBMjDBHoIkOt6Db/ua0iPC700w0Utt5kWZQ==
dependencies:
- "@abp/utils" "^4.2.0-rc.2"
+ "@abp/utils" "^4.2.1"
-"@abp/datatables.net-bs4@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.2.0-rc.2.tgz#0d14886aa756ca707dd365b423b40d84c658268e"
- integrity sha512-kX+NrGkisy7IMi+xL69dPaPOYNLBZ4Vp7xCvJqNhdc5Sh6Rn1P0bLvxFKG065mBMfgW8tyFNnN3c5WzwcRFSmg==
+"@abp/datatables.net-bs4@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.2.1.tgz#fa6d711e6af352672879130a931fc2d27e5fd9e7"
+ integrity sha512-T66P74F58n4P5xwfhekriSr66A35okrXw61mlMXqeet8ACtxiM55MhXw89qvsL0qo5qG/a9d9MWPYNmZgXvKSQ==
dependencies:
- "@abp/datatables.net" "~4.2.0-rc.2"
+ "@abp/datatables.net" "~4.2.1"
datatables.net-bs4 "^1.10.21"
-"@abp/datatables.net@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.2.0-rc.2.tgz#a82ac16c1644a92d01ba63bf57e0d3784eb00f2f"
- integrity sha512-bEQ6QSUN65lJ8fK8wOVE16cayDI64EgyVb3qZAzWUncxPyLLa5s5zlDjcQ98D3An+x3tG2CdmEEWjlAgWdaf1g==
+"@abp/datatables.net@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.2.1.tgz#a5f3549b7b581619bbffb398b2172ed7789d0486"
+ integrity sha512-ZxpSW6PhJupjecTC25MEKTdjePvg2xNouqioL9L7V3lPJ6S3fsqNs9QFjFjpv0vltzXMaZgJTSuxilmR6s6piw==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
datatables.net "^1.10.21"
-"@abp/font-awesome@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.2.0-rc.2.tgz#6c72ef7ae00beda565e9836c8214ccf074ea7e4b"
- integrity sha512-bEQPGyVsKV7aQtVwG4UIcG+DMneBD7jcjX3eFqjOlGhQq3ODbNld5IPXHO+JnHDLt5NOzrePQLUzPhsvCIwhGA==
+"@abp/font-awesome@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.2.1.tgz#81d718b08a1f08bf35dd0887f9c6c9f1ea5416ee"
+ integrity sha512-kWAOqN7OtiBA7gd3VLH7pft1A5KYnJGJCn56xoqWIqLyHrSapwI5IMOojRDr+WhQJXk5EGE+rnmqRP51MYo4NQ==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
"@fortawesome/fontawesome-free" "^5.13.0"
-"@abp/jquery-form@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.2.0-rc.2.tgz#a4726794f78cf69dd75c0adda3dca3ed623f02d8"
- integrity sha512-rOGXYTTiQUD2HWTabh0+Ot6LX4PEObd3DW3ikBHZSnfen7W0OgnLdqNaunHYSEV3UUgCAZHaX0wQd4SM0pRMLg==
+"@abp/jquery-form@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.2.1.tgz#bbc21aafd88aa0f89619ce72fbafc917812d15e4"
+ integrity sha512-xnxaaOExhz7/8/P6XGvQuKitpuVjzoZz+r1Kr+W9gVy0dWZcCOfeVi4kdpxDFpqUmQJQJi0tvdVkFHx/hAkB7g==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
jquery-form "^4.3.0"
-"@abp/jquery-validation-unobtrusive@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.2.0-rc.2.tgz#5dee22e1bcbd44bd8e2584d37d79e8313cf615ec"
- integrity sha512-xk56Otr6PG/bED2yJuPo0OhwcgS4FQQXySgPD9e7mlZQcjxZ4LvmRU/btoNoxSHKYUBLKRfEOYOqRTxJhrH0eA==
+"@abp/jquery-validation-unobtrusive@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.2.1.tgz#36681e75e43e8f708bbd5d6e359eefd8dcce86df"
+ integrity sha512-STuVKdSUNjrW3q30GcszgzecHDdPmL3aA0jPsRJr0S2Wp5CQOe0dB7d5xyAnADIL68cPXjZWlz1OyXSQ2LixeQ==
dependencies:
- "@abp/jquery-validation" "~4.2.0-rc.2"
+ "@abp/jquery-validation" "~4.2.1"
jquery-validation-unobtrusive "^3.2.11"
-"@abp/jquery-validation@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.2.0-rc.2.tgz#594b9132d1eafebed60be10d219bc9e8b15f18b6"
- integrity sha512-LkNI3X7gpYYkI3DnCTZ1KIV6ykKMqw6pLZhFvTZz7GliZWE1jHtFos4U6lWe2XnMjnFeVeY6rPFM/1LaamfCKg==
+"@abp/jquery-validation@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.2.1.tgz#209b0acb500ac301bb66b3f04bc18b9c574e2fcf"
+ integrity sha512-g87I0nO7Jk2d4Jt7PlLk/bHu5xQFH4+mbHwH4oRLAzflDhRNtNB+uVF35HK/1shprmSlZt6X+bHz652SEqD81g==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
jquery-validation "^1.19.2"
-"@abp/jquery@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.2.0-rc.2.tgz#146589cbf4397be727d38798d557f3879ae51057"
- integrity sha512-yTYk5rRG3qnRKnA/pSXZNH/+KJcJ2Wo5BUtt3G8oKAe+no0Au1BoCV9j7JNiSnLXkFVWFuRwEZCh+cp6ngACng==
+"@abp/jquery@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.2.1.tgz#b8ed11cbc02d33cdc99cacbaf5089343a0f164c5"
+ integrity sha512-xcoSu/2qc2AEF+dCTNHTCWjAo1dIcohHVPM3Yh36bb+JEcnruYYRokqZc4pzkh0GQamE1eMVGi3QOAmuURtbCg==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
jquery "~3.5.1"
-"@abp/lodash@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.2.0-rc.2.tgz#f0a238991c288f439e2751938a39d434dd7883e7"
- integrity sha512-En9gZD8TDY8ZvZqHVsv3cP2EsRdPRsGD0ncUYOvlNG/sc+MZpRmZ+xOLws1wXS83IxGAxzPdCFEu0biJlyOyxg==
+"@abp/lodash@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.2.1.tgz#87b7f48cf494553f7cd43dddf625a90581555ae7"
+ integrity sha512-hDwzR/Q9GqXPdQaijQ3B4GIWZ8z9clCW9vU59qbELD8xBZIJalTSrUGnIT8YNB9O5tNFb2FWJJbw5Nh8K7lu1A==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
lodash "^4.17.15"
-"@abp/luxon@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.2.0-rc.2.tgz#ace30caacf6abcce1559b65046ea55e47e1cb8a2"
- integrity sha512-ivhOadlaeBh6Pi3S5Bo0pb4EPCEjMFL5N5tZXGGieZt7EnF+4uiXbKJVErXNCDtX1jhJT/3HGqmdxa+WynUE0A==
+"@abp/luxon@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.2.1.tgz#e29c1fe9903beb0fc4d32cab90a5de4ebc768e43"
+ integrity sha512-Sussnocvw75EbJ1j0Ohn7F+SBQy9xPbiG6RJExdDFzxhUNsVp5wJF2Jm8hOZB3DYkeGAOskY5RoIG0abfE/j3w==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
luxon "^1.24.1"
-"@abp/malihu-custom-scrollbar-plugin@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.2.0-rc.2.tgz#483668c09e13b0ebcea16320a16f8517fcdd53ee"
- integrity sha512-IYOwJcWyJkn/gdp4VkEYCv2Gi5+Boxe7pE7hA49gxgllHiFV0ABDFrRg4h8MbyJd80iwvVPo8t8ouvn4Snm+gQ==
+"@abp/malihu-custom-scrollbar-plugin@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.2.1.tgz#0c491d772ab0bb03d7eead0b9715bddb44252d56"
+ integrity sha512-qBnBMzj4G/dAMShmF4EXr55hkMehC1+cB6Jjl1wPHgMV8QPafznBKGyM6KWxGhrl8K6nCErBbidgQKpYqtWhNA==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
malihu-custom-scrollbar-plugin "^3.1.5"
-"@abp/prismjs@^4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-4.2.0-rc.2.tgz#6fe8f0063f4d674ddf309725acf65225ee3b1b1e"
- integrity sha512-pvqGp5FmcDPVKBsPsPbJsbdLRK1i9RJGawYZUSwzyNOdjckf+jWviyFCN/xwt8gx5eHB2eY/VO957yX0y0ti2A==
+"@abp/prismjs@^4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-4.2.1.tgz#4029e69efe88a24903760cb3031c90ae1ddb0d3c"
+ integrity sha512-QxSQ4l8Bdpl8sntZWlPdSb2YQwSMtFPqudod/4atC0ttZKK1DZNMW3HRInsRo3gZDc9XzwMAazci4BPaJHG6eA==
dependencies:
- "@abp/clipboard" "~4.2.0-rc.2"
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/clipboard" "~4.2.1"
+ "@abp/core" "~4.2.1"
prismjs "^1.20.0"
-"@abp/select2@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.2.0-rc.2.tgz#d11e808dac90e09e14025b6ba6dabed683a9b1fb"
- integrity sha512-fENomkoAML+NQWvZ/ecjvqnXtvrzJKyChwj9Ul12c+Noi6boeuFDbhi/OG6qCrSzDnNBrehHVXBLFxT9sIL0OA==
+"@abp/select2@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.2.1.tgz#2f397cc1754135642385333bf47a1a106dd9b165"
+ integrity sha512-g1AUGof5daULbVFCokR9JS1/4gIpEWKB5/+rRJBmnje2hUgBA3llD5PCOh5WRHA7urJJOD/5BjWlFdozluUAyg==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
select2 "^4.0.13"
-"@abp/sweetalert@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.2.0-rc.2.tgz#2359eeb9e4b34c4cbb3aaed11136ea3d280bd677"
- integrity sha512-oQPj2vKPNAOvBECgJFdDwvJ8nwQ54ZPsAW1XS3XSkFz3YwWn4Xt9eZK6vecHloYckSckrFtsN/DSQI8ao/uIFg==
+"@abp/sweetalert@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.2.1.tgz#bdbc28c3f73b314b8ca792ea73390fe9f558c03f"
+ integrity sha512-xTi0oSjAkFMIDHgF8YB+oqFCl4gNfnt7mGHvEjJwpCEQSkuML9QsiGvw1TpXyHP7npOWSjjVpoyEBS2HXC778Q==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
sweetalert "^2.1.2"
-"@abp/timeago@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.2.0-rc.2.tgz#d243acff635978068ec579c83a34d0680616c5ef"
- integrity sha512-TF1dt9ro3BQnfVetDzbOkedSIncSwvPfnHKMY1xcLG2h0c6ke2PjDQ+4QJrtigggT4vfgmQtRrs/zJxjzWS7qw==
+"@abp/timeago@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.2.1.tgz#38474ed4455e94c687a3124e1a6e77c3b29a87d3"
+ integrity sha512-46+2plKizUcRn2VWN5WPWvwEVz+xoKOmsH1tEJ8WKKNxjeNRAsfeOslbfIEks89hTXLQemP3txAbq9V3E8pwQw==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
timeago "^1.6.7"
-"@abp/toastr@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.2.0-rc.2.tgz#4e76f4b7068f92b267b725ad597b8315e6b615bc"
- integrity sha512-UJVuQWc7py54JC35RrH+MwAZsOoOhejxX+3aonz8Io2rgFFj0YwK5U+vItRNM3iabSqTcIExcSD3XL2TmQyVzg==
+"@abp/toastr@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.2.1.tgz#9e30607f7ff7067588d0a660226d338003c37707"
+ integrity sha512-fdlMZjffEO/05aeG8BjTspARKGtUu2SpoFViTeHGhSPsCW55BvuehIgRhyOEQNfMqJz8m0cVR0R2q+WPFWf1XA==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
toastr "^2.1.4"
-"@abp/utils@^4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.2.0-rc.2.tgz#43c27d421da8e58a5d74c0a2df8742efa827c842"
- integrity sha512-6gSLTP9s88aFjxm+fU2iZMzv5Eoe5/va2PHTAoQJA4BaP/SpFRGts3cT4HYWPfAbmzZVZ+tvjuYd3P6d3FCAhw==
+"@abp/utils@^4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.2.1.tgz#1f5bfa7aae0065ec4dc38f1f5dc393b664c92d5c"
+ integrity sha512-V7XYC38u4C+UpXQr28KA1KHL5nNgDsFHfZULPnkwPxV8DuhzemmPYN3qmSXi5hfSfp+psNCX3GYZRMCI57kHgQ==
dependencies:
just-compare "^1.3.0"
diff --git a/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_CustomServiceConstruction_Tests.cs b/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_CustomServiceConstruction_Tests.cs
new file mode 100644
index 0000000000..c1995970b5
--- /dev/null
+++ b/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_CustomServiceConstruction_Tests.cs
@@ -0,0 +1,83 @@
+using System;
+using AutoMapper;
+using Microsoft.Extensions.DependencyInjection;
+using Shouldly;
+using Volo.Abp.Modularity;
+using Volo.Abp.Testing;
+using Xunit;
+using IObjectMapper = Volo.Abp.ObjectMapping.IObjectMapper;
+
+namespace Volo.Abp.AutoMapper
+{
+ public class AutoMapper_CustomServiceConstruction_Tests : AbpIntegratedTest
+ {
+ private readonly IObjectMapper _objectMapper;
+
+ public AutoMapper_CustomServiceConstruction_Tests()
+ {
+ _objectMapper = ServiceProvider.GetRequiredService();
+ }
+
+ [Fact]
+ public void Should_Custom_Service_Construction()
+ {
+ var source = new SourceModel
+ {
+ Name = nameof(SourceModel)
+ };
+ _objectMapper.Map(source).Name.ShouldBe(nameof(CustomMappingAction));
+ }
+
+ [DependsOn(typeof(AbpAutoMapperModule))]
+ public class TestModule : AbpModule
+ {
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ Configure(options =>
+ {
+ options.AddMaps();
+ options.Configurators.Add(configurationContext =>
+ {
+ configurationContext.MapperConfiguration.ConstructServicesUsing(type =>
+ type.Name.Contains(nameof(CustomMappingAction))
+ ? new CustomMappingAction(nameof(CustomMappingAction))
+ : Activator.CreateInstance(type));
+ });
+ });
+ }
+ }
+
+ public class SourceModel
+ {
+ public string Name { get; set; }
+ }
+
+ public class DestModel
+ {
+ public string Name { get; set; }
+ }
+
+ public class MapperActionProfile : Profile
+ {
+ public MapperActionProfile()
+ {
+ CreateMap().AfterMap();
+ }
+ }
+
+ public class CustomMappingAction : IMappingAction
+ {
+ private readonly string _name;
+
+ public CustomMappingAction(string name)
+ {
+ _name = name;
+ }
+
+ public void Process(SourceModel source, DestModel destination, ResolutionContext context)
+ {
+ destination.Name = _name;
+ }
+ }
+ }
+}
diff --git a/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_Dependency_Injection_Tests.cs b/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_Dependency_Injection_Tests.cs
index 56c5e6f061..7edf32eb23 100644
--- a/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_Dependency_Injection_Tests.cs
+++ b/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_Dependency_Injection_Tests.cs
@@ -19,7 +19,7 @@ namespace Volo.Abp.AutoMapper
[Fact]
public void Should_Registered_AutoMapper_Service()
{
- GetService().ShouldNotBeNull();
+ GetService().ShouldNotBeNull();
}
[Fact]
@@ -47,15 +47,30 @@ namespace Volo.Abp.AutoMapper
{
public MapperActionProfile()
{
- CreateMap().AfterMap();
+ CreateMap().AfterMap();
}
}
- public class CustomMappingActionService : IMappingAction
+ public class CustomMappingAction : IMappingAction
{
+ private readonly CustomMappingActionService _customMappingActionService;
+
+ public CustomMappingAction(CustomMappingActionService customMappingActionService)
+ {
+ _customMappingActionService = customMappingActionService;
+ }
+
public void Process(SourceModel source, DestModel destination, ResolutionContext context)
{
- destination.Name = nameof(CustomMappingActionService);
+ destination.Name = _customMappingActionService.GetName();
+ }
+ }
+
+ public class CustomMappingActionService : ITransientDependency
+ {
+ public string GetName()
+ {
+ return nameof(CustomMappingActionService);
}
}
}
diff --git a/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs b/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs
index 32876c08fe..c1d5af64ef 100644
--- a/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs
+++ b/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs
@@ -712,5 +712,240 @@ namespace Volo.Abp.Caching
(await personCache.GetAsync("john")).Name.ShouldBe("John Nash");
(await personCache.GetAsync("baris")).ShouldBeNull();
}
+
+ [Fact]
+ public async Task Should_Get_And_Add_Multiple_Items_Async()
+ {
+ var testkey = "testkey";
+ var testkey2 = "testkey2";
+
+ var testkey3 = new[] {testkey, testkey2};
+ var personCache = GetRequiredService>();
+
+ await personCache.SetAsync(testkey, new PersonCacheItem("john"));
+
+ var cacheValue = await personCache.GetManyAsync(testkey3);
+ cacheValue.Length.ShouldBe(2);
+ cacheValue[0].Value.Name.ShouldBe("john");
+ cacheValue[1].Value.ShouldBeNull();
+
+ cacheValue = await personCache.GetOrAddManyAsync(testkey3, (missingKeys) =>
+ {
+ var missingKeyArray = missingKeys.ToArray();
+ missingKeyArray.Length.ShouldBe(1);
+ missingKeyArray[0].ShouldBe(testkey2);
+
+ return Task.FromResult(new List>
+ {
+ new(testkey2, new PersonCacheItem("jack"))
+ });
+ });
+
+ cacheValue.Length.ShouldBe(2);
+ cacheValue[0].Value.Name.ShouldBe("john");
+ cacheValue[1].Value.Name.ShouldBe("jack");
+
+ cacheValue = await personCache.GetManyAsync(testkey3);
+ cacheValue.Length.ShouldBe(2);
+ cacheValue[0].Value.Name.ShouldBe("john");
+ cacheValue[1].Value.Name.ShouldBe("jack");
+ }
+
+ [Fact]
+ public async Task Cache_Should_Only_Available_In_Uow_For_GetOrAddManyAsync()
+ {
+ var testkey = "testkey";
+ var testkey2 = "testkey2";
+
+ var testkey3 = new[] {testkey, testkey2};
+
+ using (var uow = GetRequiredService().Begin())
+ {
+ var personCache = GetRequiredService>();
+
+ var cacheValue = await personCache.GetOrAddManyAsync(testkey3, (missingKeys) => Task.FromResult(new List>
+ {
+ new(testkey, new PersonCacheItem("john")),
+ new(testkey2, new PersonCacheItem("jack")),
+ }), considerUow: true);
+
+ cacheValue.Length.ShouldBe(2);
+ cacheValue[0].Value.Name.ShouldBe("john");
+ cacheValue[1].Value.Name.ShouldBe("jack");
+
+ cacheValue = await personCache.GetManyAsync(testkey3, considerUow: true);
+ cacheValue.Length.ShouldBe(2);
+ cacheValue[0].Value.Name.ShouldBe("john");
+ cacheValue[1].Value.Name.ShouldBe("jack");
+
+ cacheValue = await personCache.GetManyAsync(testkey3, considerUow: false);
+ cacheValue.Length.ShouldBe(2);
+ cacheValue[0].Value.ShouldBeNull();
+ cacheValue[1].Value.ShouldBeNull();
+
+ uow.OnCompleted(async () =>
+ {
+ cacheValue = await personCache.GetManyAsync(testkey3, considerUow: false);
+ cacheValue.ShouldNotBeNull();
+ cacheValue[0].Value.Name.ShouldBe("john");
+ cacheValue[1].Value.Name.ShouldBe("jack");
+ });
+
+ await uow.CompleteAsync();
+ }
+ }
+
+ [Fact]
+ public async Task Cache_Should_Rollback_With_Uow_For_GetOrAddManyAsync()
+ {
+ var testkey = "testkey";
+ var testkey2 = "testkey2";
+
+ var testkey3 = new[] {testkey, testkey2};
+
+ var personCache = GetRequiredService>();
+
+ var cacheValue = await personCache.GetManyAsync(testkey3, considerUow: false);
+ cacheValue.Length.ShouldBe(2);
+ cacheValue[0].Value.ShouldBeNull();
+ cacheValue[1].Value.ShouldBeNull();
+
+ using (var uow = GetRequiredService().Begin())
+ {
+ cacheValue = await personCache.GetOrAddManyAsync(testkey3, (missingKeys) => Task.FromResult(new List>
+ {
+ new(testkey, new PersonCacheItem("john")),
+ new(testkey2, new PersonCacheItem("jack")),
+ }), considerUow: true);
+
+ cacheValue.Length.ShouldBe(2);
+ cacheValue[0].Value.Name.ShouldBe("john");
+ cacheValue[1].Value.Name.ShouldBe("jack");
+
+ cacheValue = await personCache.GetManyAsync(testkey3, considerUow: true);
+ cacheValue.Length.ShouldBe(2);
+ cacheValue[0].Value.Name.ShouldBe("john");
+ cacheValue[1].Value.Name.ShouldBe("jack");
+
+ cacheValue = await personCache.GetManyAsync(testkey3, considerUow: false);
+ cacheValue.Length.ShouldBe(2);
+ cacheValue[0].Value.ShouldBeNull();
+ cacheValue[1].Value.ShouldBeNull();
+ }
+
+ cacheValue = await personCache.GetManyAsync(testkey3, considerUow: false);
+ cacheValue.Length.ShouldBe(2);
+ cacheValue[0].Value.ShouldBeNull();
+ cacheValue[1].Value.ShouldBeNull();
+ }
+
+ [Fact]
+ public async Task Should_Remove_Multiple_Items_Async()
+ {
+ var testkey = "testkey";
+ var testkey2 = "testkey2";
+ var testkey3 = new[] {testkey, testkey2};
+
+ var personCache = GetRequiredService>();
+
+ await personCache.SetManyAsync(new List>
+ {
+ new(testkey, new PersonCacheItem("john")),
+ new(testkey2, new PersonCacheItem("jack"))
+ });
+
+ await personCache.RemoveManyAsync(testkey3);
+
+ var cacheValue = await personCache.GetManyAsync(testkey3);
+ cacheValue.Length.ShouldBe(2);
+ cacheValue[0].Value.ShouldBeNull();
+ cacheValue[1].Value.ShouldBeNull();
+ }
+
+ [Fact]
+ public async Task Cache_Should_Only_Available_In_Uow_For_RemoveManyAsync()
+ {
+ var testkey = "testkey";
+ var testkey2 = "testkey2";
+ var testkey3 = new[] {testkey, testkey2};
+ var personCache = GetRequiredService>();
+
+ var cacheValue = await personCache.GetManyAsync(testkey3, considerUow: false);
+ cacheValue.Length.ShouldBe(2);
+ cacheValue[0].Value.ShouldBeNull();
+ cacheValue[1].Value.ShouldBeNull();
+
+ using (var uow = GetRequiredService().Begin())
+ {
+ await personCache.SetManyAsync(new List>
+ {
+ new(testkey, new PersonCacheItem("john")),
+ new(testkey2, new PersonCacheItem("jack"))
+ });
+
+ cacheValue = await personCache.GetManyAsync(testkey3, considerUow: true);
+ cacheValue.Length.ShouldBe(2);
+ cacheValue[0].Value.Name.ShouldBe("john");
+ cacheValue[1].Value.Name.ShouldBe("jack");
+
+ await personCache.RemoveManyAsync(testkey3, considerUow: true);
+
+ cacheValue = await personCache.GetManyAsync(testkey3, considerUow: false);
+ cacheValue.Length.ShouldBe(2);
+ cacheValue[0].Value.Name.ShouldBe("john");
+ cacheValue[1].Value.Name.ShouldBe("jack");
+
+ uow.OnCompleted(async () =>
+ {
+ cacheValue = await personCache.GetManyAsync(testkey3, considerUow: false);
+ cacheValue.ShouldNotBeNull();
+ cacheValue[0].Value.ShouldBeNull();
+ cacheValue[1].Value.ShouldBeNull();
+ });
+
+ await uow.CompleteAsync();
+ }
+
+ }
+
+ [Fact]
+ public async Task Cache_Should_Rollback_With_Uow_For_RemoveManyAsync()
+ {
+ var testkey = "testkey";
+ var testkey2 = "testkey2";
+ var testkey3 = new[] {testkey, testkey2};
+ var personCache = GetRequiredService>();
+
+ var cacheValue = await personCache.GetManyAsync(testkey3, considerUow: false);
+ cacheValue.Length.ShouldBe(2);
+ cacheValue[0].Value.ShouldBeNull();
+ cacheValue[1].Value.ShouldBeNull();
+
+ using (var uow = GetRequiredService().Begin())
+ {
+ await personCache.SetManyAsync(new List>
+ {
+ new(testkey, new PersonCacheItem("john")),
+ new(testkey2, new PersonCacheItem("jack"))
+ }, considerUow: true);
+
+ cacheValue = await personCache.GetManyAsync(testkey3, considerUow: true);
+ cacheValue.Length.ShouldBe(2);
+ cacheValue[0].Value.Name.ShouldBe("john");
+ cacheValue[1].Value.Name.ShouldBe("jack");
+
+ await personCache.RemoveManyAsync(testkey3, considerUow: true);
+
+ cacheValue = await personCache.GetManyAsync(testkey3, considerUow: true);
+ cacheValue.Length.ShouldBe(2);
+ cacheValue[0].Value.ShouldBeNull();
+ cacheValue[1].Value.ShouldBeNull();
+ }
+
+ cacheValue = await personCache.GetManyAsync(testkey3, considerUow: true);
+ cacheValue.Length.ShouldBe(2);
+ cacheValue[0].Value.ShouldBeNull();
+ cacheValue[1].Value.ShouldBeNull();
+ }
}
}
diff --git a/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/TestMemoryDistributedCache.cs b/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/TestMemoryDistributedCache.cs
index 69589d97cd..5df5b488d9 100644
--- a/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/TestMemoryDistributedCache.cs
+++ b/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/TestMemoryDistributedCache.cs
@@ -57,5 +57,37 @@ namespace Volo.Abp.Caching
await SetAsync(item.Key, item.Value, options, token);
}
}
+
+ public void RefreshMany(IEnumerable keys)
+ {
+ foreach (var key in keys)
+ {
+ Refresh(key);
+ }
+ }
+
+ public async Task RefreshManyAsync(IEnumerable keys, CancellationToken token = default)
+ {
+ foreach (var key in keys)
+ {
+ await RefreshAsync(key, token);
+ }
+ }
+
+ public void RemoveMany(IEnumerable keys)
+ {
+ foreach (var key in keys)
+ {
+ Remove(key);
+ }
+ }
+
+ public async Task RemoveManyAsync(IEnumerable keys, CancellationToken token = default)
+ {
+ foreach (var key in keys)
+ {
+ await RemoveAsync(key, token);
+ }
+ }
}
}
diff --git a/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus_Test.cs b/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus_Test.cs
index d3371f383a..5bea07fc44 100644
--- a/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus_Test.cs
+++ b/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Distributed/LocalDistributedEventBus_Test.cs
@@ -44,5 +44,23 @@ namespace Volo.Abp.EventBus.Distributed
Assert.Equal(tenantId, MySimpleDistributedSingleInstanceEventHandler.TenantId);
}
+
+ [Fact]
+ public async Task Should_Get_TenantId_From_EventEto_Extra_Property()
+ {
+ var tenantId = Guid.NewGuid();
+
+ DistributedEventBus.Subscribe(GetRequiredService());
+
+ await DistributedEventBus.PublishAsync(new MySimpleEto
+ {
+ Properties =
+ {
+ {"TenantId", tenantId.ToString()}
+ }
+ });
+
+ Assert.Equal(tenantId, MySimpleDistributedSingleInstanceEventHandler.TenantId);
+ }
}
}
diff --git a/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Distributed/MySimpleDistributedSingleInstanceEventHandler.cs b/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Distributed/MySimpleDistributedSingleInstanceEventHandler.cs
index 53fe8e347b..9141a28024 100644
--- a/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Distributed/MySimpleDistributedSingleInstanceEventHandler.cs
+++ b/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/Distributed/MySimpleDistributedSingleInstanceEventHandler.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Entities.Events.Distributed;
@@ -6,7 +7,7 @@ using Volo.Abp.MultiTenancy;
namespace Volo.Abp.EventBus.Distributed
{
- public class MySimpleDistributedSingleInstanceEventHandler : IDistributedEventHandler, IDistributedEventHandler>, ITransientDependency
+ public class MySimpleDistributedSingleInstanceEventHandler : IDistributedEventHandler, IDistributedEventHandler>, IDistributedEventHandler, ITransientDependency
{
private readonly ICurrentTenant _currentTenant;
@@ -28,5 +29,12 @@ namespace Volo.Abp.EventBus.Distributed
TenantId = _currentTenant.Id;
return Task.CompletedTask;
}
+
+ public Task HandleEventAsync(MySimpleEto eventData)
+ {
+ var tenantIdString = eventData.Properties.GetOrDefault("TenantId").ToString();
+ TenantId = tenantIdString != null ? new Guid(tenantIdString) : _currentTenant.Id;
+ return Task.CompletedTask;
+ }
}
}
diff --git a/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/MySimpleEto.cs b/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/MySimpleEto.cs
new file mode 100644
index 0000000000..55d176c392
--- /dev/null
+++ b/framework/test/Volo.Abp.EventBus.Tests/Volo/Abp/EventBus/MySimpleEto.cs
@@ -0,0 +1,8 @@
+using Volo.Abp.Domain.Entities.Events.Distributed;
+
+namespace Volo.Abp.EventBus
+{
+ public class MySimpleEto : EtoBase
+ {
+ }
+}
\ No newline at end of file
diff --git a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpHybridJsonSerializer_Tests.cs b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpHybridJsonSerializer_Tests.cs
index eb44e51820..f719eb68f8 100644
--- a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpHybridJsonSerializer_Tests.cs
+++ b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpHybridJsonSerializer_Tests.cs
@@ -63,6 +63,23 @@ namespace Volo.Abp.Json
json.ShouldContain("SystemTextJson");
}
+
+ [Fact]
+ public void SystemTextJsonSerialize_With_Dictionary_Test()
+ {
+ var json = _jsonSerializer.Serialize(new MyClassWithDictionary
+ {
+ Properties =
+ {
+ {"A", "AV"},
+ {"B", "BV"}
+ }
+ });
+
+ var deserialized = _jsonSerializer.Deserialize(json);
+ deserialized.Properties.ShouldContain(p => p.Key == "A" && p.Value == "AV");
+ deserialized.Properties.ShouldContain(p => p.Key == "B" && p.Value == "BV");
+ }
public class MyClass1
{
@@ -83,6 +100,16 @@ namespace Volo.Abp.Json
public string Provider { get; set; }
}
+ public class MyClassWithDictionary
+ {
+ public Dictionary Properties { get; set; }
+
+ public MyClassWithDictionary()
+ {
+ Properties = new Dictionary();
+ }
+ }
+
class NewtonsoftJsonConverter : JsonConverter, ITransientDependency
{
public override void WriteJson(JsonWriter writer, MyClass1 value, JsonSerializer serializer)
diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/SoftDelete_Tests.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/SoftDelete_Tests.cs
index b8618fd6a3..4b313d2127 100644
--- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/SoftDelete_Tests.cs
+++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/SoftDelete_Tests.cs
@@ -56,6 +56,23 @@ namespace Volo.Abp.TestApp.Testing
douglas.DeletionTime.ShouldNotBeNull();
}
}
+
+ [Fact]
+ public async Task Should_Cancel_Deletion_For_Soft_Delete_Many_Entities_ById()
+ {
+ await PersonRepository.DeleteManyAsync(new []{ TestDataBuilder.UserDouglasId });
+
+ var douglas = await PersonRepository.FindAsync(TestDataBuilder.UserDouglasId);
+ douglas.ShouldBeNull();
+
+ using (DataFilter.Disable())
+ {
+ douglas = await PersonRepository.FindAsync(TestDataBuilder.UserDouglasId);
+ douglas.ShouldNotBeNull();
+ douglas.IsDeleted.ShouldBeTrue();
+ douglas.DeletionTime.ShouldNotBeNull();
+ }
+ }
[Fact]
public async Task Should_Handle_Deletion_On_Update_For_Soft_Delete_Entities()
diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContext.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContext.cs
index d879803677..e49fa3fe55 100644
--- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContext.cs
+++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContext.cs
@@ -1,15 +1,17 @@
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
+using Volo.Abp.MultiTenancy;
namespace Volo.Abp.BackgroundJobs.EntityFrameworkCore
{
+ [IgnoreMultiTenancy]
[ConnectionStringName(BackgroundJobsDbProperties.ConnectionStringName)]
public class BackgroundJobsDbContext : AbpDbContext, IBackgroundJobsDbContext
{
public DbSet BackgroundJobs { get; set; }
- public BackgroundJobsDbContext(DbContextOptions options)
+ public BackgroundJobsDbContext(DbContextOptions options)
: base(options)
{
@@ -22,4 +24,4 @@ namespace Volo.Abp.BackgroundJobs.EntityFrameworkCore
builder.ConfigureBackgroundJobs();
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContextModelCreatingExtensions.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContextModelCreatingExtensions.cs
index 0d16130fb5..0e36a661f6 100644
--- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContextModelCreatingExtensions.cs
+++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContextModelCreatingExtensions.cs
@@ -12,13 +12,18 @@ namespace Volo.Abp.BackgroundJobs.EntityFrameworkCore
{
Check.NotNull(builder, nameof(builder));
+ if (builder.IsTenantOnlyDatabase())
+ {
+ return;
+ }
+
var options = new BackgroundJobsModelBuilderConfigurationOptions(
BackgroundJobsDbProperties.DbTablePrefix,
BackgroundJobsDbProperties.DbSchema
);
optionsAction?.Invoke(options);
-
+
builder.Entity(b =>
{
b.ToTable(options.TablePrefix + "BackgroundJobs", options.Schema);
@@ -32,9 +37,9 @@ namespace Volo.Abp.BackgroundJobs.EntityFrameworkCore
b.Property(x => x.LastTryTime);
b.Property(x => x.IsAbandoned).HasDefaultValue(false);
b.Property(x => x.Priority).HasDefaultValue(BackgroundJobPriority.Normal);
-
+
b.HasIndex(x => new { x.IsAbandoned, x.NextTryTime });
});
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/IBackgroundJobsDbContext.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/IBackgroundJobsDbContext.cs
index cc70b6543a..46701b863e 100644
--- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/IBackgroundJobsDbContext.cs
+++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/IBackgroundJobsDbContext.cs
@@ -1,12 +1,14 @@
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
+using Volo.Abp.MultiTenancy;
namespace Volo.Abp.BackgroundJobs.EntityFrameworkCore
{
+ [IgnoreMultiTenancy]
[ConnectionStringName(BackgroundJobsDbProperties.ConnectionStringName)]
public interface IBackgroundJobsDbContext : IEfCoreDbContext
{
DbSet BackgroundJobs { get; }
}
-}
\ No newline at end of file
+}
diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbContext.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbContext.cs
index 745903cae7..13a058bc33 100644
--- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbContext.cs
+++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbContext.cs
@@ -1,9 +1,11 @@
using MongoDB.Driver;
using Volo.Abp.Data;
using Volo.Abp.MongoDB;
+using Volo.Abp.MultiTenancy;
namespace Volo.Abp.BackgroundJobs.MongoDB
{
+ [IgnoreMultiTenancy]
[ConnectionStringName(BackgroundJobsDbProperties.ConnectionStringName)]
public class BackgroundJobsMongoDbContext : AbpMongoDbContext, IBackgroundJobsMongoDbContext
{
@@ -16,4 +18,4 @@ namespace Volo.Abp.BackgroundJobs.MongoDB
modelBuilder.ConfigureBackgroundJobs();
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/IBackgroundJobsMongoDbContext.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/IBackgroundJobsMongoDbContext.cs
index 8e2d11869d..254d22d63c 100644
--- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/IBackgroundJobsMongoDbContext.cs
+++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/IBackgroundJobsMongoDbContext.cs
@@ -1,9 +1,11 @@
using MongoDB.Driver;
using Volo.Abp.Data;
using Volo.Abp.MongoDB;
+using Volo.Abp.MultiTenancy;
namespace Volo.Abp.BackgroundJobs.MongoDB
{
+ [IgnoreMultiTenancy]
[ConnectionStringName(BackgroundJobsDbProperties.ConnectionStringName)]
public interface IBackgroundJobsMongoDbContext : IAbpMongoDbContext
{
diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/DatabaseBlobContainer.cs b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/DatabaseBlobContainer.cs
index 4342d9092c..df912b84e5 100644
--- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/DatabaseBlobContainer.cs
+++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/DatabaseBlobContainer.cs
@@ -5,17 +5,17 @@ using Volo.Abp.MultiTenancy;
namespace Volo.Abp.BlobStoring.Database
{
- public class DatabaseBlobContainer : AggregateRoot, IMultiTenant //TODO: Rename to BlobContainer
+ public class DatabaseBlobContainer : AggregateRoot, IMultiTenant
{
public virtual Guid? TenantId { get; protected set; }
public virtual string Name { get; protected set; }
- public DatabaseBlobContainer(Guid id, [NotNull] string name, Guid? tenantId = null)
+ public DatabaseBlobContainer(Guid id, [NotNull] string name, Guid? tenantId = null)
: base(id)
{
Name = Check.NotNullOrWhiteSpace(name, nameof(name), DatabaseContainerConsts.MaxNameLength);
TenantId = tenantId;
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/blogging/app/Volo.BloggingTestApp/package.json b/modules/blogging/app/Volo.BloggingTestApp/package.json
index 1a97b62da3..a4ba0ae306 100644
--- a/modules/blogging/app/Volo.BloggingTestApp/package.json
+++ b/modules/blogging/app/Volo.BloggingTestApp/package.json
@@ -3,7 +3,7 @@
"name": "volo.blogtestapp",
"private": true,
"dependencies": {
- "@abp/aspnetcore.mvc.ui.theme.basic": "^4.2.0-rc.2",
- "@abp/blogging": "^4.2.0-rc.2"
+ "@abp/aspnetcore.mvc.ui.theme.basic": "^4.2.1",
+ "@abp/blogging": "^4.2.1"
}
}
\ No newline at end of file
diff --git a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock
index 6f7c1a81f7..96a737240e 100644
--- a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock
+++ b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock
@@ -2,37 +2,37 @@
# yarn lockfile v1
-"@abp/aspnetcore.mvc.ui.theme.basic@^4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.2.0-rc.2.tgz#f4625e18fd3704d432913e9de59c7183770ea485"
- integrity sha512-wwOFcrICyhgAcBq7zgdIkYQ8Mov0g1iYrjoRZRiUzBYG4wkcAO9POM9asE6uvY5sD/hd0cRoXSZOcNKUt0J1SA==
- dependencies:
- "@abp/aspnetcore.mvc.ui.theme.shared" "~4.2.0-rc.2"
-
-"@abp/aspnetcore.mvc.ui.theme.shared@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.2.0-rc.2.tgz#9ff3af53b667e747c06d3f067a0f68a938ac72a8"
- integrity sha512-qsJ6UaUxyOJOHxsqVjlUGhCvQUnbXgGzLvFPJZYLpnWm6ZvE1KAgJnQHL46YSllCDT0meVqHt9byjOCRJUMm9Q==
- dependencies:
- "@abp/aspnetcore.mvc.ui" "~4.2.0-rc.2"
- "@abp/bootstrap" "~4.2.0-rc.2"
- "@abp/bootstrap-datepicker" "~4.2.0-rc.2"
- "@abp/datatables.net-bs4" "~4.2.0-rc.2"
- "@abp/font-awesome" "~4.2.0-rc.2"
- "@abp/jquery-form" "~4.2.0-rc.2"
- "@abp/jquery-validation-unobtrusive" "~4.2.0-rc.2"
- "@abp/lodash" "~4.2.0-rc.2"
- "@abp/luxon" "~4.2.0-rc.2"
- "@abp/malihu-custom-scrollbar-plugin" "~4.2.0-rc.2"
- "@abp/select2" "~4.2.0-rc.2"
- "@abp/sweetalert" "~4.2.0-rc.2"
- "@abp/timeago" "~4.2.0-rc.2"
- "@abp/toastr" "~4.2.0-rc.2"
-
-"@abp/aspnetcore.mvc.ui@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.2.0-rc.2.tgz#726f45c7ff12e69e970fb89b4adfb15502a11576"
- integrity sha512-EzTYQ8XzXIprfK95LyYc1Ci3to3dNlBOSzkkYfYDXkSR5/SyBKckCTd5FL4c7yrs+qBoJMxKWDyWz+pmf6PIJA==
+"@abp/aspnetcore.mvc.ui.theme.basic@^4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.2.1.tgz#78b465ab8fcd68a38e2b868717d00e5f5d3b0c61"
+ integrity sha512-Tb0g4mtdSsjQkadvnjjRjObEhweUvigto0BTv5SzRNi0oQLW8ZVUcFmuMWB09nJAIPrbuA3QuPUlXzFcv2gsdg==
+ dependencies:
+ "@abp/aspnetcore.mvc.ui.theme.shared" "~4.2.1"
+
+"@abp/aspnetcore.mvc.ui.theme.shared@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.2.1.tgz#18205c13f137dad9876c4153f34273a7c8e69854"
+ integrity sha512-+f54CysWpEKfxjIIjhnTKW0jJ0Rg+wS6yxb9Rg3qxA5iEUkxp3B+NB5wA9rT5YcY9APrwVpiw1miNRmq5ZvFXg==
+ dependencies:
+ "@abp/aspnetcore.mvc.ui" "~4.2.1"
+ "@abp/bootstrap" "~4.2.1"
+ "@abp/bootstrap-datepicker" "~4.2.1"
+ "@abp/datatables.net-bs4" "~4.2.1"
+ "@abp/font-awesome" "~4.2.1"
+ "@abp/jquery-form" "~4.2.1"
+ "@abp/jquery-validation-unobtrusive" "~4.2.1"
+ "@abp/lodash" "~4.2.1"
+ "@abp/luxon" "~4.2.1"
+ "@abp/malihu-custom-scrollbar-plugin" "~4.2.1"
+ "@abp/select2" "~4.2.1"
+ "@abp/sweetalert" "~4.2.1"
+ "@abp/timeago" "~4.2.1"
+ "@abp/toastr" "~4.2.1"
+
+"@abp/aspnetcore.mvc.ui@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.2.1.tgz#2ad368af731678213ff3d8448a3dd30a2f1f66c9"
+ integrity sha512-/a/KDVQ3EuETSSe+KqmsR24w6RWHvaokvmmOjL+tCpFQyeaYAZ88E9pvM5hC9HVR24FCHTiARiXwgMTw2eZFyQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@@ -43,214 +43,214 @@
micromatch "^4.0.2"
path "^0.12.7"
-"@abp/blogging@^4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-4.2.0-rc.2.tgz#ba757ce0dc244dad0e5a807b3d4540320cfa79c4"
- integrity sha512-iWksm+5YJDryVdh1VZwnBaRy6fsJzeZBdeM3fCFQIYaKHF6orYfVUeLXuLXFVjDfuV8alhlo7rI5ANG6dsI0bw==
+"@abp/blogging@^4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-4.2.1.tgz#9276cdced0e33bd3118824ffab2653d9487d159e"
+ integrity sha512-zRAZqgdn7e+DpTwh8eMhVnx6utkMpUtUoMW4eA0DESQB1qQ1E2fEAKl1NjzJ2CinhvNty1psCsI+k2gVHQUYeA==
dependencies:
- "@abp/aspnetcore.mvc.ui.theme.shared" "~4.2.0-rc.2"
- "@abp/owl.carousel" "~4.2.0-rc.2"
- "@abp/prismjs" "~4.2.0-rc.2"
- "@abp/tui-editor" "~4.2.0-rc.2"
+ "@abp/aspnetcore.mvc.ui.theme.shared" "~4.2.1"
+ "@abp/owl.carousel" "~4.2.1"
+ "@abp/prismjs" "~4.2.1"
+ "@abp/tui-editor" "~4.2.1"
-"@abp/bootstrap-datepicker@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.2.0-rc.2.tgz#f2a6d013321c98f8c9a7533087360fce9a5fd074"
- integrity sha512-n3gLYLL7hHX83gurN5iRkpairrw0oAyg+Bc6SeIbNAdorun9wBJn7IlmvXxGPn1xK5iDKktRSeWJ885fMgkuWg==
+"@abp/bootstrap-datepicker@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.2.1.tgz#87fe913aa6923a39206f4481af3b02309e2cebd5"
+ integrity sha512-35uaM+OBUqsBBIF08NUu7XBVIgwVQIjJard92Px7eR0EJ2AW6f5hNlJQYfPkYVdmkPIpG16qWctICB+L2W3ZKA==
dependencies:
bootstrap-datepicker "^1.9.0"
-"@abp/bootstrap@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.2.0-rc.2.tgz#49250657f667f7553f3c2149fda43f7535de989b"
- integrity sha512-WYdyDQzgFlltxqdYINAMVWjXiiDAx780fTJEd3YKLSzxmVGBfoW4cfFzw8vr/G/EMYrgAPQtrIS+BRlFAJXXGQ==
+"@abp/bootstrap@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.2.1.tgz#12d8b0cddb5fca55888e01644ff49ed7d78069e9"
+ integrity sha512-1Z4atDgHDxesjBh5uPb442NALcUucS2Lt56CaN5UPBXQvAPr72cw4hfKbW08KJ0ab7WME0uCi1vYZFM28/zqTg==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
-"@abp/clipboard@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-4.2.0-rc.2.tgz#0cda5f6f3624e68e1ec7290517364d02f2b60e42"
- integrity sha512-wF/d8Xuq+ORUkiWgDorM7rxueiygtELaZKlRDYzmQRnwJN4vS1q/4/UtPaLSlcGhHxWuxu2XSWQtzcphfBjFWA==
+"@abp/clipboard@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-4.2.1.tgz#93132b1f3009883da00d074e9ce2a45fdb368fea"
+ integrity sha512-yMbBbiPdm187XtPX0unfdjSTd5Lmh9U527kw/suq0NqFwMEOVQkdW7gA1Xm1Ierit5OwvNP3vE6sHqTk7LhLWw==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
clipboard "^2.0.6"
-"@abp/codemirror@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-4.2.0-rc.2.tgz#70086f33b73c75a4e0e8e5552b812b1e466d4a3f"
- integrity sha512-FM3lCG6e3Xxy9AyfVbOvVBysH4rnIYyG/IOHxqW3h6Twz2pWi+s5vA4dXnbb/+ODeFwD72+eJ5F6yRKXWamrmA==
+"@abp/codemirror@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-4.2.1.tgz#33614bf789da88ccb1521f93527c7bf8e6d519bc"
+ integrity sha512-kY7KiFDQiVHPIKxumJszPXJlZIyOUpKxh8zmZiOvPm4ixUb4pOZZrPJ1u0HPpADU0RTFdB3Hq3AMzfwaXR2CGw==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
codemirror "^5.54.0"
-"@abp/core@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.2.0-rc.2.tgz#dc18c3b8f294563ba62c000c026f5ceb86030456"
- integrity sha512-YJz4xUwb/mv/Xi/WuPz2SF/LD22P/UJ+psb+35ezOeuj020IAdaunk8LdrU5TfaZqNe5WpGszKMA+jO9ydNuqA==
+"@abp/core@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.2.1.tgz#1e74b0ffbc8c938e8de2f320594637910a09cbab"
+ integrity sha512-EiJSgUytS9Mrv8GZr9pwIzxwlrP82hEcS67cAgDxBc4QOhtMXhGZBMjDBHoIkOt6Db/ua0iPC700w0Utt5kWZQ==
dependencies:
- "@abp/utils" "^4.2.0-rc.2"
+ "@abp/utils" "^4.2.1"
-"@abp/datatables.net-bs4@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.2.0-rc.2.tgz#0d14886aa756ca707dd365b423b40d84c658268e"
- integrity sha512-kX+NrGkisy7IMi+xL69dPaPOYNLBZ4Vp7xCvJqNhdc5Sh6Rn1P0bLvxFKG065mBMfgW8tyFNnN3c5WzwcRFSmg==
+"@abp/datatables.net-bs4@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.2.1.tgz#fa6d711e6af352672879130a931fc2d27e5fd9e7"
+ integrity sha512-T66P74F58n4P5xwfhekriSr66A35okrXw61mlMXqeet8ACtxiM55MhXw89qvsL0qo5qG/a9d9MWPYNmZgXvKSQ==
dependencies:
- "@abp/datatables.net" "~4.2.0-rc.2"
+ "@abp/datatables.net" "~4.2.1"
datatables.net-bs4 "^1.10.21"
-"@abp/datatables.net@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.2.0-rc.2.tgz#a82ac16c1644a92d01ba63bf57e0d3784eb00f2f"
- integrity sha512-bEQ6QSUN65lJ8fK8wOVE16cayDI64EgyVb3qZAzWUncxPyLLa5s5zlDjcQ98D3An+x3tG2CdmEEWjlAgWdaf1g==
+"@abp/datatables.net@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.2.1.tgz#a5f3549b7b581619bbffb398b2172ed7789d0486"
+ integrity sha512-ZxpSW6PhJupjecTC25MEKTdjePvg2xNouqioL9L7V3lPJ6S3fsqNs9QFjFjpv0vltzXMaZgJTSuxilmR6s6piw==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
datatables.net "^1.10.21"
-"@abp/font-awesome@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.2.0-rc.2.tgz#6c72ef7ae00beda565e9836c8214ccf074ea7e4b"
- integrity sha512-bEQPGyVsKV7aQtVwG4UIcG+DMneBD7jcjX3eFqjOlGhQq3ODbNld5IPXHO+JnHDLt5NOzrePQLUzPhsvCIwhGA==
+"@abp/font-awesome@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.2.1.tgz#81d718b08a1f08bf35dd0887f9c6c9f1ea5416ee"
+ integrity sha512-kWAOqN7OtiBA7gd3VLH7pft1A5KYnJGJCn56xoqWIqLyHrSapwI5IMOojRDr+WhQJXk5EGE+rnmqRP51MYo4NQ==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
"@fortawesome/fontawesome-free" "^5.13.0"
-"@abp/highlight.js@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-4.2.0-rc.2.tgz#c7e99394868863265b20328c2189d14d0630501d"
- integrity sha512-bBjAPSHRGHz7xhtpC4oy3L/QV6mJuHx3LRxyd5wwhuyWsuv9qzo4GoHQsgR6gK9ANI9LGbVp+91vFaXjsNGj2A==
+"@abp/highlight.js@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-4.2.1.tgz#85702403328a36ad3a15347b566e11aa5bafeda0"
+ integrity sha512-3Tn4xqenO+LyB5mPgCbGmX+hoRwQwoQcfKG41upkr1jwn2M6+ljTo9NgB53wqaeJZsbhOPPfknKkLJzOl4UeRg==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
-"@abp/jquery-form@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.2.0-rc.2.tgz#a4726794f78cf69dd75c0adda3dca3ed623f02d8"
- integrity sha512-rOGXYTTiQUD2HWTabh0+Ot6LX4PEObd3DW3ikBHZSnfen7W0OgnLdqNaunHYSEV3UUgCAZHaX0wQd4SM0pRMLg==
+"@abp/jquery-form@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.2.1.tgz#bbc21aafd88aa0f89619ce72fbafc917812d15e4"
+ integrity sha512-xnxaaOExhz7/8/P6XGvQuKitpuVjzoZz+r1Kr+W9gVy0dWZcCOfeVi4kdpxDFpqUmQJQJi0tvdVkFHx/hAkB7g==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
jquery-form "^4.3.0"
-"@abp/jquery-validation-unobtrusive@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.2.0-rc.2.tgz#5dee22e1bcbd44bd8e2584d37d79e8313cf615ec"
- integrity sha512-xk56Otr6PG/bED2yJuPo0OhwcgS4FQQXySgPD9e7mlZQcjxZ4LvmRU/btoNoxSHKYUBLKRfEOYOqRTxJhrH0eA==
+"@abp/jquery-validation-unobtrusive@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.2.1.tgz#36681e75e43e8f708bbd5d6e359eefd8dcce86df"
+ integrity sha512-STuVKdSUNjrW3q30GcszgzecHDdPmL3aA0jPsRJr0S2Wp5CQOe0dB7d5xyAnADIL68cPXjZWlz1OyXSQ2LixeQ==
dependencies:
- "@abp/jquery-validation" "~4.2.0-rc.2"
+ "@abp/jquery-validation" "~4.2.1"
jquery-validation-unobtrusive "^3.2.11"
-"@abp/jquery-validation@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.2.0-rc.2.tgz#594b9132d1eafebed60be10d219bc9e8b15f18b6"
- integrity sha512-LkNI3X7gpYYkI3DnCTZ1KIV6ykKMqw6pLZhFvTZz7GliZWE1jHtFos4U6lWe2XnMjnFeVeY6rPFM/1LaamfCKg==
+"@abp/jquery-validation@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.2.1.tgz#209b0acb500ac301bb66b3f04bc18b9c574e2fcf"
+ integrity sha512-g87I0nO7Jk2d4Jt7PlLk/bHu5xQFH4+mbHwH4oRLAzflDhRNtNB+uVF35HK/1shprmSlZt6X+bHz652SEqD81g==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
jquery-validation "^1.19.2"
-"@abp/jquery@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.2.0-rc.2.tgz#146589cbf4397be727d38798d557f3879ae51057"
- integrity sha512-yTYk5rRG3qnRKnA/pSXZNH/+KJcJ2Wo5BUtt3G8oKAe+no0Au1BoCV9j7JNiSnLXkFVWFuRwEZCh+cp6ngACng==
+"@abp/jquery@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.2.1.tgz#b8ed11cbc02d33cdc99cacbaf5089343a0f164c5"
+ integrity sha512-xcoSu/2qc2AEF+dCTNHTCWjAo1dIcohHVPM3Yh36bb+JEcnruYYRokqZc4pzkh0GQamE1eMVGi3QOAmuURtbCg==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
jquery "~3.5.1"
-"@abp/lodash@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.2.0-rc.2.tgz#f0a238991c288f439e2751938a39d434dd7883e7"
- integrity sha512-En9gZD8TDY8ZvZqHVsv3cP2EsRdPRsGD0ncUYOvlNG/sc+MZpRmZ+xOLws1wXS83IxGAxzPdCFEu0biJlyOyxg==
+"@abp/lodash@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.2.1.tgz#87b7f48cf494553f7cd43dddf625a90581555ae7"
+ integrity sha512-hDwzR/Q9GqXPdQaijQ3B4GIWZ8z9clCW9vU59qbELD8xBZIJalTSrUGnIT8YNB9O5tNFb2FWJJbw5Nh8K7lu1A==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
lodash "^4.17.15"
-"@abp/luxon@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.2.0-rc.2.tgz#ace30caacf6abcce1559b65046ea55e47e1cb8a2"
- integrity sha512-ivhOadlaeBh6Pi3S5Bo0pb4EPCEjMFL5N5tZXGGieZt7EnF+4uiXbKJVErXNCDtX1jhJT/3HGqmdxa+WynUE0A==
+"@abp/luxon@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.2.1.tgz#e29c1fe9903beb0fc4d32cab90a5de4ebc768e43"
+ integrity sha512-Sussnocvw75EbJ1j0Ohn7F+SBQy9xPbiG6RJExdDFzxhUNsVp5wJF2Jm8hOZB3DYkeGAOskY5RoIG0abfE/j3w==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
luxon "^1.24.1"
-"@abp/malihu-custom-scrollbar-plugin@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.2.0-rc.2.tgz#483668c09e13b0ebcea16320a16f8517fcdd53ee"
- integrity sha512-IYOwJcWyJkn/gdp4VkEYCv2Gi5+Boxe7pE7hA49gxgllHiFV0ABDFrRg4h8MbyJd80iwvVPo8t8ouvn4Snm+gQ==
+"@abp/malihu-custom-scrollbar-plugin@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.2.1.tgz#0c491d772ab0bb03d7eead0b9715bddb44252d56"
+ integrity sha512-qBnBMzj4G/dAMShmF4EXr55hkMehC1+cB6Jjl1wPHgMV8QPafznBKGyM6KWxGhrl8K6nCErBbidgQKpYqtWhNA==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
malihu-custom-scrollbar-plugin "^3.1.5"
-"@abp/markdown-it@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/markdown-it/-/markdown-it-4.2.0-rc.2.tgz#b3b983e2b0a4f6ff99223b2cd7982144c1683226"
- integrity sha512-jiBUx6bzbBfjDry6kEdZsKYylkixzPHeNuJ8AsMsF1FqJ6LIgsuWeRbT+bToHd25AZ1ZxTnqYM5efKXia0N4/w==
+"@abp/markdown-it@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/markdown-it/-/markdown-it-4.2.1.tgz#7f33fdbaebafcadc5dd7b39d13b27fcda9ebbd43"
+ integrity sha512-nhN0SrsQ2fqy0yM2p7+jE96K7qSxc794uZc2xxngbsIGGShxwBx9dDOlQaE4TA44Fu7PoE6jQCYsdzXbakP9iQ==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
markdown-it "^11.0.0"
-"@abp/owl.carousel@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-4.2.0-rc.2.tgz#c5cdf1f53e539b891f1fe265091570e71bdf83c0"
- integrity sha512-hl8XtVB0II/piGeXLS0e50oKYWT8YDw5QsL9/DnvJnneigrFoAFnVR0siavgr+C6jY3XqQR8aCpxByi82PvUDQ==
+"@abp/owl.carousel@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-4.2.1.tgz#f6ae488649038d8e0272712be60b9fcd529fa54c"
+ integrity sha512-uOLM90DaMeYiwRAff5UrlaCty1sTmLkYALw4aOpJRo4+cXlXeEP4RkVbe/nLU3DMxFndll2MINllPuXs2GPCQQ==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
owl.carousel "^2.3.4"
-"@abp/prismjs@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-4.2.0-rc.2.tgz#6fe8f0063f4d674ddf309725acf65225ee3b1b1e"
- integrity sha512-pvqGp5FmcDPVKBsPsPbJsbdLRK1i9RJGawYZUSwzyNOdjckf+jWviyFCN/xwt8gx5eHB2eY/VO957yX0y0ti2A==
+"@abp/prismjs@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-4.2.1.tgz#4029e69efe88a24903760cb3031c90ae1ddb0d3c"
+ integrity sha512-QxSQ4l8Bdpl8sntZWlPdSb2YQwSMtFPqudod/4atC0ttZKK1DZNMW3HRInsRo3gZDc9XzwMAazci4BPaJHG6eA==
dependencies:
- "@abp/clipboard" "~4.2.0-rc.2"
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/clipboard" "~4.2.1"
+ "@abp/core" "~4.2.1"
prismjs "^1.20.0"
-"@abp/select2@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.2.0-rc.2.tgz#d11e808dac90e09e14025b6ba6dabed683a9b1fb"
- integrity sha512-fENomkoAML+NQWvZ/ecjvqnXtvrzJKyChwj9Ul12c+Noi6boeuFDbhi/OG6qCrSzDnNBrehHVXBLFxT9sIL0OA==
+"@abp/select2@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.2.1.tgz#2f397cc1754135642385333bf47a1a106dd9b165"
+ integrity sha512-g1AUGof5daULbVFCokR9JS1/4gIpEWKB5/+rRJBmnje2hUgBA3llD5PCOh5WRHA7urJJOD/5BjWlFdozluUAyg==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
select2 "^4.0.13"
-"@abp/sweetalert@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.2.0-rc.2.tgz#2359eeb9e4b34c4cbb3aaed11136ea3d280bd677"
- integrity sha512-oQPj2vKPNAOvBECgJFdDwvJ8nwQ54ZPsAW1XS3XSkFz3YwWn4Xt9eZK6vecHloYckSckrFtsN/DSQI8ao/uIFg==
+"@abp/sweetalert@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.2.1.tgz#bdbc28c3f73b314b8ca792ea73390fe9f558c03f"
+ integrity sha512-xTi0oSjAkFMIDHgF8YB+oqFCl4gNfnt7mGHvEjJwpCEQSkuML9QsiGvw1TpXyHP7npOWSjjVpoyEBS2HXC778Q==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
sweetalert "^2.1.2"
-"@abp/timeago@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.2.0-rc.2.tgz#d243acff635978068ec579c83a34d0680616c5ef"
- integrity sha512-TF1dt9ro3BQnfVetDzbOkedSIncSwvPfnHKMY1xcLG2h0c6ke2PjDQ+4QJrtigggT4vfgmQtRrs/zJxjzWS7qw==
+"@abp/timeago@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.2.1.tgz#38474ed4455e94c687a3124e1a6e77c3b29a87d3"
+ integrity sha512-46+2plKizUcRn2VWN5WPWvwEVz+xoKOmsH1tEJ8WKKNxjeNRAsfeOslbfIEks89hTXLQemP3txAbq9V3E8pwQw==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
timeago "^1.6.7"
-"@abp/toastr@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.2.0-rc.2.tgz#4e76f4b7068f92b267b725ad597b8315e6b615bc"
- integrity sha512-UJVuQWc7py54JC35RrH+MwAZsOoOhejxX+3aonz8Io2rgFFj0YwK5U+vItRNM3iabSqTcIExcSD3XL2TmQyVzg==
+"@abp/toastr@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.2.1.tgz#9e30607f7ff7067588d0a660226d338003c37707"
+ integrity sha512-fdlMZjffEO/05aeG8BjTspARKGtUu2SpoFViTeHGhSPsCW55BvuehIgRhyOEQNfMqJz8m0cVR0R2q+WPFWf1XA==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
toastr "^2.1.4"
-"@abp/tui-editor@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-4.2.0-rc.2.tgz#25e97dd47ccbd8a22ac47a9d46fd1d0f9a2f762a"
- integrity sha512-7giF6IFxYOPfoDPJupEXeFKSzf7iB14RUIA6h7+8AXw7OfIeobpdZq3qCpRRgS4UiP1eemaegeT6s42maL498Q==
+"@abp/tui-editor@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-4.2.1.tgz#8db0872bfd555b0a5db93b4cd5ef045e5313cb27"
+ integrity sha512-jxdCU7g3q5HMb+8ZgaeZ5Ub2YtHzdJv+StISwVpt+6zGDyIQjjcHGz3zQn0R4tovFk8gC1G8SJD267OezrynVQ==
dependencies:
- "@abp/codemirror" "~4.2.0-rc.2"
- "@abp/highlight.js" "~4.2.0-rc.2"
- "@abp/jquery" "~4.2.0-rc.2"
- "@abp/markdown-it" "~4.2.0-rc.2"
+ "@abp/codemirror" "~4.2.1"
+ "@abp/highlight.js" "~4.2.1"
+ "@abp/jquery" "~4.2.1"
+ "@abp/markdown-it" "~4.2.1"
tui-editor "^1.4.10"
-"@abp/utils@^4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.2.0-rc.2.tgz#43c27d421da8e58a5d74c0a2df8742efa827c842"
- integrity sha512-6gSLTP9s88aFjxm+fU2iZMzv5Eoe5/va2PHTAoQJA4BaP/SpFRGts3cT4HYWPfAbmzZVZ+tvjuYd3P6d3FCAhw==
+"@abp/utils@^4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.2.1.tgz#1f5bfa7aae0065ec4dc38f1f5dc393b664c92d5c"
+ integrity sha512-V7XYC38u4C+UpXQr28KA1KHL5nNgDsFHfZULPnkwPxV8DuhzemmPYN3qmSXi5hfSfp+psNCX3GYZRMCI57kHgQ==
dependencies:
just-compare "^1.3.0"
diff --git a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContext.cs b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContext.cs
index 4ab71a0222..85c34aa996 100644
--- a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContext.cs
+++ b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContext.cs
@@ -1,6 +1,7 @@
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
+using Volo.Abp.MultiTenancy;
using Volo.Blogging.Blogs;
using Volo.Blogging.Comments;
using Volo.Blogging.Posts;
@@ -9,6 +10,7 @@ using Volo.Blogging.Users;
namespace Volo.Blogging.EntityFrameworkCore
{
+ [IgnoreMultiTenancy]
[ConnectionStringName(BloggingDbProperties.ConnectionStringName)]
public class BloggingDbContext : AbpDbContext, IBloggingDbContext
{
@@ -23,7 +25,7 @@ namespace Volo.Blogging.EntityFrameworkCore
public DbSet PostTags { get; set; }
public DbSet Comments { get; set; }
-
+
public BloggingDbContext(DbContextOptions options)
: base(options)
{
@@ -37,4 +39,4 @@ namespace Volo.Blogging.EntityFrameworkCore
builder.ConfigureBlogging();
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContextModelBuilderExtensions.cs b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContextModelBuilderExtensions.cs
index a5e909d8a4..9c54d0a3a0 100644
--- a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContextModelBuilderExtensions.cs
+++ b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContextModelBuilderExtensions.cs
@@ -20,6 +20,11 @@ namespace Volo.Blogging.EntityFrameworkCore
{
Check.NotNull(builder, nameof(builder));
+ if (builder.IsTenantOnlyDatabase())
+ {
+ return;
+ }
+
var options = new BloggingModelBuilderConfigurationOptions(
BloggingDbProperties.DbTablePrefix,
BloggingDbProperties.DbSchema
diff --git a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/IBloggingDbContext.cs b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/IBloggingDbContext.cs
index dcdb6c78e1..ecb7c282d4 100644
--- a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/IBloggingDbContext.cs
+++ b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/IBloggingDbContext.cs
@@ -1,6 +1,7 @@
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
+using Volo.Abp.MultiTenancy;
using Volo.Blogging.Blogs;
using Volo.Blogging.Comments;
using Volo.Blogging.Posts;
@@ -9,6 +10,7 @@ using Volo.Blogging.Users;
namespace Volo.Blogging.EntityFrameworkCore
{
+ [IgnoreMultiTenancy]
[ConnectionStringName(BloggingDbProperties.ConnectionStringName)]
public interface IBloggingDbContext : IEfCoreDbContext
{
@@ -24,4 +26,4 @@ namespace Volo.Blogging.EntityFrameworkCore
DbSet Tags { get; set; }
}
-}
\ No newline at end of file
+}
diff --git a/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/BloggingMongoDbContext.cs b/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/BloggingMongoDbContext.cs
index fa265b3e67..1f20ff1744 100644
--- a/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/BloggingMongoDbContext.cs
+++ b/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/BloggingMongoDbContext.cs
@@ -1,6 +1,7 @@
using MongoDB.Driver;
using Volo.Abp.Data;
using Volo.Abp.MongoDB;
+using Volo.Abp.MultiTenancy;
using Volo.Blogging.Blogs;
using Volo.Blogging.Comments;
using Volo.Blogging.Posts;
@@ -8,6 +9,7 @@ using Volo.Blogging.Users;
namespace Volo.Blogging.MongoDB
{
+ [IgnoreMultiTenancy]
[ConnectionStringName(BloggingDbProperties.ConnectionStringName)]
public class BloggingMongoDbContext : AbpMongoDbContext, IBloggingMongoDbContext
{
diff --git a/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/IBloggingMongoDbContext.cs b/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/IBloggingMongoDbContext.cs
index 8366e87d74..1dbf5eee92 100644
--- a/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/IBloggingMongoDbContext.cs
+++ b/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/IBloggingMongoDbContext.cs
@@ -1,6 +1,7 @@
using MongoDB.Driver;
using Volo.Abp.Data;
using Volo.Abp.MongoDB;
+using Volo.Abp.MultiTenancy;
using Volo.Blogging.Blogs;
using Volo.Blogging.Comments;
using Volo.Blogging.Posts;
@@ -8,6 +9,7 @@ using Volo.Blogging.Users;
namespace Volo.Blogging.MongoDB
{
+ [IgnoreMultiTenancy]
[ConnectionStringName(BloggingDbProperties.ConnectionStringName)]
public interface IBloggingMongoDbContext : IAbpMongoDbContext
{
@@ -22,4 +24,4 @@ namespace Volo.Blogging.MongoDB
IMongoCollection Comments { get; }
}
-}
\ No newline at end of file
+}
diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json
index 9fd2034ecb..cdee343f41 100644
--- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json
+++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json
@@ -3,6 +3,6 @@
"name": "client-simulation-web",
"private": true,
"dependencies": {
- "@abp/aspnetcore.mvc.ui.theme.basic": "^4.2.0-rc.2"
+ "@abp/aspnetcore.mvc.ui.theme.basic": "^4.2.1"
}
}
\ No newline at end of file
diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock
index 8edfb8fa10..7484be2bca 100644
--- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock
+++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock
@@ -2,37 +2,37 @@
# yarn lockfile v1
-"@abp/aspnetcore.mvc.ui.theme.basic@^4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.2.0-rc.2.tgz#f4625e18fd3704d432913e9de59c7183770ea485"
- integrity sha512-wwOFcrICyhgAcBq7zgdIkYQ8Mov0g1iYrjoRZRiUzBYG4wkcAO9POM9asE6uvY5sD/hd0cRoXSZOcNKUt0J1SA==
- dependencies:
- "@abp/aspnetcore.mvc.ui.theme.shared" "~4.2.0-rc.2"
-
-"@abp/aspnetcore.mvc.ui.theme.shared@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.2.0-rc.2.tgz#9ff3af53b667e747c06d3f067a0f68a938ac72a8"
- integrity sha512-qsJ6UaUxyOJOHxsqVjlUGhCvQUnbXgGzLvFPJZYLpnWm6ZvE1KAgJnQHL46YSllCDT0meVqHt9byjOCRJUMm9Q==
- dependencies:
- "@abp/aspnetcore.mvc.ui" "~4.2.0-rc.2"
- "@abp/bootstrap" "~4.2.0-rc.2"
- "@abp/bootstrap-datepicker" "~4.2.0-rc.2"
- "@abp/datatables.net-bs4" "~4.2.0-rc.2"
- "@abp/font-awesome" "~4.2.0-rc.2"
- "@abp/jquery-form" "~4.2.0-rc.2"
- "@abp/jquery-validation-unobtrusive" "~4.2.0-rc.2"
- "@abp/lodash" "~4.2.0-rc.2"
- "@abp/luxon" "~4.2.0-rc.2"
- "@abp/malihu-custom-scrollbar-plugin" "~4.2.0-rc.2"
- "@abp/select2" "~4.2.0-rc.2"
- "@abp/sweetalert" "~4.2.0-rc.2"
- "@abp/timeago" "~4.2.0-rc.2"
- "@abp/toastr" "~4.2.0-rc.2"
-
-"@abp/aspnetcore.mvc.ui@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.2.0-rc.2.tgz#726f45c7ff12e69e970fb89b4adfb15502a11576"
- integrity sha512-EzTYQ8XzXIprfK95LyYc1Ci3to3dNlBOSzkkYfYDXkSR5/SyBKckCTd5FL4c7yrs+qBoJMxKWDyWz+pmf6PIJA==
+"@abp/aspnetcore.mvc.ui.theme.basic@^4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.2.1.tgz#78b465ab8fcd68a38e2b868717d00e5f5d3b0c61"
+ integrity sha512-Tb0g4mtdSsjQkadvnjjRjObEhweUvigto0BTv5SzRNi0oQLW8ZVUcFmuMWB09nJAIPrbuA3QuPUlXzFcv2gsdg==
+ dependencies:
+ "@abp/aspnetcore.mvc.ui.theme.shared" "~4.2.1"
+
+"@abp/aspnetcore.mvc.ui.theme.shared@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.2.1.tgz#18205c13f137dad9876c4153f34273a7c8e69854"
+ integrity sha512-+f54CysWpEKfxjIIjhnTKW0jJ0Rg+wS6yxb9Rg3qxA5iEUkxp3B+NB5wA9rT5YcY9APrwVpiw1miNRmq5ZvFXg==
+ dependencies:
+ "@abp/aspnetcore.mvc.ui" "~4.2.1"
+ "@abp/bootstrap" "~4.2.1"
+ "@abp/bootstrap-datepicker" "~4.2.1"
+ "@abp/datatables.net-bs4" "~4.2.1"
+ "@abp/font-awesome" "~4.2.1"
+ "@abp/jquery-form" "~4.2.1"
+ "@abp/jquery-validation-unobtrusive" "~4.2.1"
+ "@abp/lodash" "~4.2.1"
+ "@abp/luxon" "~4.2.1"
+ "@abp/malihu-custom-scrollbar-plugin" "~4.2.1"
+ "@abp/select2" "~4.2.1"
+ "@abp/sweetalert" "~4.2.1"
+ "@abp/timeago" "~4.2.1"
+ "@abp/toastr" "~4.2.1"
+
+"@abp/aspnetcore.mvc.ui@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.2.1.tgz#2ad368af731678213ff3d8448a3dd30a2f1f66c9"
+ integrity sha512-/a/KDVQ3EuETSSe+KqmsR24w6RWHvaokvmmOjL+tCpFQyeaYAZ88E9pvM5hC9HVR24FCHTiARiXwgMTw2eZFyQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@@ -43,145 +43,145 @@
micromatch "^4.0.2"
path "^0.12.7"
-"@abp/bootstrap-datepicker@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.2.0-rc.2.tgz#f2a6d013321c98f8c9a7533087360fce9a5fd074"
- integrity sha512-n3gLYLL7hHX83gurN5iRkpairrw0oAyg+Bc6SeIbNAdorun9wBJn7IlmvXxGPn1xK5iDKktRSeWJ885fMgkuWg==
+"@abp/bootstrap-datepicker@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.2.1.tgz#87fe913aa6923a39206f4481af3b02309e2cebd5"
+ integrity sha512-35uaM+OBUqsBBIF08NUu7XBVIgwVQIjJard92Px7eR0EJ2AW6f5hNlJQYfPkYVdmkPIpG16qWctICB+L2W3ZKA==
dependencies:
bootstrap-datepicker "^1.9.0"
-"@abp/bootstrap@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.2.0-rc.2.tgz#49250657f667f7553f3c2149fda43f7535de989b"
- integrity sha512-WYdyDQzgFlltxqdYINAMVWjXiiDAx780fTJEd3YKLSzxmVGBfoW4cfFzw8vr/G/EMYrgAPQtrIS+BRlFAJXXGQ==
+"@abp/bootstrap@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.2.1.tgz#12d8b0cddb5fca55888e01644ff49ed7d78069e9"
+ integrity sha512-1Z4atDgHDxesjBh5uPb442NALcUucS2Lt56CaN5UPBXQvAPr72cw4hfKbW08KJ0ab7WME0uCi1vYZFM28/zqTg==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
-"@abp/core@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.2.0-rc.2.tgz#dc18c3b8f294563ba62c000c026f5ceb86030456"
- integrity sha512-YJz4xUwb/mv/Xi/WuPz2SF/LD22P/UJ+psb+35ezOeuj020IAdaunk8LdrU5TfaZqNe5WpGszKMA+jO9ydNuqA==
+"@abp/core@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.2.1.tgz#1e74b0ffbc8c938e8de2f320594637910a09cbab"
+ integrity sha512-EiJSgUytS9Mrv8GZr9pwIzxwlrP82hEcS67cAgDxBc4QOhtMXhGZBMjDBHoIkOt6Db/ua0iPC700w0Utt5kWZQ==
dependencies:
- "@abp/utils" "^4.2.0-rc.2"
+ "@abp/utils" "^4.2.1"
-"@abp/datatables.net-bs4@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.2.0-rc.2.tgz#0d14886aa756ca707dd365b423b40d84c658268e"
- integrity sha512-kX+NrGkisy7IMi+xL69dPaPOYNLBZ4Vp7xCvJqNhdc5Sh6Rn1P0bLvxFKG065mBMfgW8tyFNnN3c5WzwcRFSmg==
+"@abp/datatables.net-bs4@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.2.1.tgz#fa6d711e6af352672879130a931fc2d27e5fd9e7"
+ integrity sha512-T66P74F58n4P5xwfhekriSr66A35okrXw61mlMXqeet8ACtxiM55MhXw89qvsL0qo5qG/a9d9MWPYNmZgXvKSQ==
dependencies:
- "@abp/datatables.net" "~4.2.0-rc.2"
+ "@abp/datatables.net" "~4.2.1"
datatables.net-bs4 "^1.10.21"
-"@abp/datatables.net@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.2.0-rc.2.tgz#a82ac16c1644a92d01ba63bf57e0d3784eb00f2f"
- integrity sha512-bEQ6QSUN65lJ8fK8wOVE16cayDI64EgyVb3qZAzWUncxPyLLa5s5zlDjcQ98D3An+x3tG2CdmEEWjlAgWdaf1g==
+"@abp/datatables.net@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.2.1.tgz#a5f3549b7b581619bbffb398b2172ed7789d0486"
+ integrity sha512-ZxpSW6PhJupjecTC25MEKTdjePvg2xNouqioL9L7V3lPJ6S3fsqNs9QFjFjpv0vltzXMaZgJTSuxilmR6s6piw==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
datatables.net "^1.10.21"
-"@abp/font-awesome@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.2.0-rc.2.tgz#6c72ef7ae00beda565e9836c8214ccf074ea7e4b"
- integrity sha512-bEQPGyVsKV7aQtVwG4UIcG+DMneBD7jcjX3eFqjOlGhQq3ODbNld5IPXHO+JnHDLt5NOzrePQLUzPhsvCIwhGA==
+"@abp/font-awesome@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.2.1.tgz#81d718b08a1f08bf35dd0887f9c6c9f1ea5416ee"
+ integrity sha512-kWAOqN7OtiBA7gd3VLH7pft1A5KYnJGJCn56xoqWIqLyHrSapwI5IMOojRDr+WhQJXk5EGE+rnmqRP51MYo4NQ==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
"@fortawesome/fontawesome-free" "^5.13.0"
-"@abp/jquery-form@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.2.0-rc.2.tgz#a4726794f78cf69dd75c0adda3dca3ed623f02d8"
- integrity sha512-rOGXYTTiQUD2HWTabh0+Ot6LX4PEObd3DW3ikBHZSnfen7W0OgnLdqNaunHYSEV3UUgCAZHaX0wQd4SM0pRMLg==
+"@abp/jquery-form@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.2.1.tgz#bbc21aafd88aa0f89619ce72fbafc917812d15e4"
+ integrity sha512-xnxaaOExhz7/8/P6XGvQuKitpuVjzoZz+r1Kr+W9gVy0dWZcCOfeVi4kdpxDFpqUmQJQJi0tvdVkFHx/hAkB7g==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
jquery-form "^4.3.0"
-"@abp/jquery-validation-unobtrusive@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.2.0-rc.2.tgz#5dee22e1bcbd44bd8e2584d37d79e8313cf615ec"
- integrity sha512-xk56Otr6PG/bED2yJuPo0OhwcgS4FQQXySgPD9e7mlZQcjxZ4LvmRU/btoNoxSHKYUBLKRfEOYOqRTxJhrH0eA==
+"@abp/jquery-validation-unobtrusive@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.2.1.tgz#36681e75e43e8f708bbd5d6e359eefd8dcce86df"
+ integrity sha512-STuVKdSUNjrW3q30GcszgzecHDdPmL3aA0jPsRJr0S2Wp5CQOe0dB7d5xyAnADIL68cPXjZWlz1OyXSQ2LixeQ==
dependencies:
- "@abp/jquery-validation" "~4.2.0-rc.2"
+ "@abp/jquery-validation" "~4.2.1"
jquery-validation-unobtrusive "^3.2.11"
-"@abp/jquery-validation@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.2.0-rc.2.tgz#594b9132d1eafebed60be10d219bc9e8b15f18b6"
- integrity sha512-LkNI3X7gpYYkI3DnCTZ1KIV6ykKMqw6pLZhFvTZz7GliZWE1jHtFos4U6lWe2XnMjnFeVeY6rPFM/1LaamfCKg==
+"@abp/jquery-validation@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.2.1.tgz#209b0acb500ac301bb66b3f04bc18b9c574e2fcf"
+ integrity sha512-g87I0nO7Jk2d4Jt7PlLk/bHu5xQFH4+mbHwH4oRLAzflDhRNtNB+uVF35HK/1shprmSlZt6X+bHz652SEqD81g==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
jquery-validation "^1.19.2"
-"@abp/jquery@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.2.0-rc.2.tgz#146589cbf4397be727d38798d557f3879ae51057"
- integrity sha512-yTYk5rRG3qnRKnA/pSXZNH/+KJcJ2Wo5BUtt3G8oKAe+no0Au1BoCV9j7JNiSnLXkFVWFuRwEZCh+cp6ngACng==
+"@abp/jquery@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.2.1.tgz#b8ed11cbc02d33cdc99cacbaf5089343a0f164c5"
+ integrity sha512-xcoSu/2qc2AEF+dCTNHTCWjAo1dIcohHVPM3Yh36bb+JEcnruYYRokqZc4pzkh0GQamE1eMVGi3QOAmuURtbCg==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
jquery "~3.5.1"
-"@abp/lodash@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.2.0-rc.2.tgz#f0a238991c288f439e2751938a39d434dd7883e7"
- integrity sha512-En9gZD8TDY8ZvZqHVsv3cP2EsRdPRsGD0ncUYOvlNG/sc+MZpRmZ+xOLws1wXS83IxGAxzPdCFEu0biJlyOyxg==
+"@abp/lodash@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.2.1.tgz#87b7f48cf494553f7cd43dddf625a90581555ae7"
+ integrity sha512-hDwzR/Q9GqXPdQaijQ3B4GIWZ8z9clCW9vU59qbELD8xBZIJalTSrUGnIT8YNB9O5tNFb2FWJJbw5Nh8K7lu1A==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
lodash "^4.17.15"
-"@abp/luxon@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.2.0-rc.2.tgz#ace30caacf6abcce1559b65046ea55e47e1cb8a2"
- integrity sha512-ivhOadlaeBh6Pi3S5Bo0pb4EPCEjMFL5N5tZXGGieZt7EnF+4uiXbKJVErXNCDtX1jhJT/3HGqmdxa+WynUE0A==
+"@abp/luxon@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.2.1.tgz#e29c1fe9903beb0fc4d32cab90a5de4ebc768e43"
+ integrity sha512-Sussnocvw75EbJ1j0Ohn7F+SBQy9xPbiG6RJExdDFzxhUNsVp5wJF2Jm8hOZB3DYkeGAOskY5RoIG0abfE/j3w==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
luxon "^1.24.1"
-"@abp/malihu-custom-scrollbar-plugin@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.2.0-rc.2.tgz#483668c09e13b0ebcea16320a16f8517fcdd53ee"
- integrity sha512-IYOwJcWyJkn/gdp4VkEYCv2Gi5+Boxe7pE7hA49gxgllHiFV0ABDFrRg4h8MbyJd80iwvVPo8t8ouvn4Snm+gQ==
+"@abp/malihu-custom-scrollbar-plugin@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.2.1.tgz#0c491d772ab0bb03d7eead0b9715bddb44252d56"
+ integrity sha512-qBnBMzj4G/dAMShmF4EXr55hkMehC1+cB6Jjl1wPHgMV8QPafznBKGyM6KWxGhrl8K6nCErBbidgQKpYqtWhNA==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
malihu-custom-scrollbar-plugin "^3.1.5"
-"@abp/select2@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.2.0-rc.2.tgz#d11e808dac90e09e14025b6ba6dabed683a9b1fb"
- integrity sha512-fENomkoAML+NQWvZ/ecjvqnXtvrzJKyChwj9Ul12c+Noi6boeuFDbhi/OG6qCrSzDnNBrehHVXBLFxT9sIL0OA==
+"@abp/select2@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.2.1.tgz#2f397cc1754135642385333bf47a1a106dd9b165"
+ integrity sha512-g1AUGof5daULbVFCokR9JS1/4gIpEWKB5/+rRJBmnje2hUgBA3llD5PCOh5WRHA7urJJOD/5BjWlFdozluUAyg==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
select2 "^4.0.13"
-"@abp/sweetalert@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.2.0-rc.2.tgz#2359eeb9e4b34c4cbb3aaed11136ea3d280bd677"
- integrity sha512-oQPj2vKPNAOvBECgJFdDwvJ8nwQ54ZPsAW1XS3XSkFz3YwWn4Xt9eZK6vecHloYckSckrFtsN/DSQI8ao/uIFg==
+"@abp/sweetalert@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.2.1.tgz#bdbc28c3f73b314b8ca792ea73390fe9f558c03f"
+ integrity sha512-xTi0oSjAkFMIDHgF8YB+oqFCl4gNfnt7mGHvEjJwpCEQSkuML9QsiGvw1TpXyHP7npOWSjjVpoyEBS2HXC778Q==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
sweetalert "^2.1.2"
-"@abp/timeago@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.2.0-rc.2.tgz#d243acff635978068ec579c83a34d0680616c5ef"
- integrity sha512-TF1dt9ro3BQnfVetDzbOkedSIncSwvPfnHKMY1xcLG2h0c6ke2PjDQ+4QJrtigggT4vfgmQtRrs/zJxjzWS7qw==
+"@abp/timeago@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.2.1.tgz#38474ed4455e94c687a3124e1a6e77c3b29a87d3"
+ integrity sha512-46+2plKizUcRn2VWN5WPWvwEVz+xoKOmsH1tEJ8WKKNxjeNRAsfeOslbfIEks89hTXLQemP3txAbq9V3E8pwQw==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
timeago "^1.6.7"
-"@abp/toastr@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.2.0-rc.2.tgz#4e76f4b7068f92b267b725ad597b8315e6b615bc"
- integrity sha512-UJVuQWc7py54JC35RrH+MwAZsOoOhejxX+3aonz8Io2rgFFj0YwK5U+vItRNM3iabSqTcIExcSD3XL2TmQyVzg==
+"@abp/toastr@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.2.1.tgz#9e30607f7ff7067588d0a660226d338003c37707"
+ integrity sha512-fdlMZjffEO/05aeG8BjTspARKGtUu2SpoFViTeHGhSPsCW55BvuehIgRhyOEQNfMqJz8m0cVR0R2q+WPFWf1XA==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
toastr "^2.1.4"
-"@abp/utils@^4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.2.0-rc.2.tgz#43c27d421da8e58a5d74c0a2df8742efa827c842"
- integrity sha512-6gSLTP9s88aFjxm+fU2iZMzv5Eoe5/va2PHTAoQJA4BaP/SpFRGts3cT4HYWPfAbmzZVZ+tvjuYd3P6d3FCAhw==
+"@abp/utils@^4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.2.1.tgz#1f5bfa7aae0065ec4dc38f1f5dc393b664c92d5c"
+ integrity sha512-V7XYC38u4C+UpXQr28KA1KHL5nNgDsFHfZULPnkwPxV8DuhzemmPYN3qmSXi5hfSfp+psNCX3GYZRMCI57kHgQ==
dependencies:
just-compare "^1.3.0"
diff --git a/modules/cms-kit/angular/package.json b/modules/cms-kit/angular/package.json
index f0c70ee363..fc8c45eed7 100644
--- a/modules/cms-kit/angular/package.json
+++ b/modules/cms-kit/angular/package.json
@@ -16,10 +16,10 @@
"private": true,
"dependencies": {
"@abp/ng.account": "~3.3.2",
- "@abp/ng.identity": "~4.2.0-rc.2",
- "@abp/ng.setting-management": "~4.2.0-rc.2",
- "@abp/ng.tenant-management": "~4.2.0-rc.2",
- "@abp/ng.theme.basic": "~4.2.0-rc.2",
+ "@abp/ng.identity": "~4.2.1",
+ "@abp/ng.setting-management": "~4.2.1",
+ "@abp/ng.tenant-management": "~4.2.1",
+ "@abp/ng.theme.basic": "~4.2.1",
"@angular/animations": "~10.0.0",
"@angular/common": "~10.0.0",
"@angular/compiler": "~10.0.0",
diff --git a/modules/cms-kit/angular/projects/cms-kit/package.json b/modules/cms-kit/angular/projects/cms-kit/package.json
index a8e4549b0a..7ebc6d0f46 100644
--- a/modules/cms-kit/angular/projects/cms-kit/package.json
+++ b/modules/cms-kit/angular/projects/cms-kit/package.json
@@ -4,8 +4,8 @@
"peerDependencies": {
"@angular/common": "^9.1.11",
"@angular/core": "^9.1.11",
- "@abp/ng.core": ">=4.2.0-rc.2",
- "@abp/ng.theme.shared": ">=4.2.0-rc.2"
+ "@abp/ng.core": ">=4.2.1",
+ "@abp/ng.theme.shared": ">=4.2.1"
},
"dependencies": {
"tslib": "^2.0.0"
diff --git a/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs b/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs
index 9046c60aca..b108d08b02 100644
--- a/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs
+++ b/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs
@@ -1,5 +1,6 @@
using Volo.Abp.GlobalFeatures;
using Volo.Abp.Threading;
+using Volo.CmsKit.GlobalFeatures;
namespace Volo.CmsKit
{
@@ -12,6 +13,7 @@ namespace Volo.CmsKit
OneTimeRunner.Run(() =>
{
GlobalFeatureManager.Instance.Modules.CmsKit().EnableAll();
+ GlobalFeatureManager.Instance.Modules.CmsKit().Disable();
});
}
}
diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json
index 214c743fe8..0f1ccbade2 100644
--- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json
+++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json
@@ -3,6 +3,6 @@
"name": "my-app-identityserver",
"private": true,
"dependencies": {
- "@abp/aspnetcore.mvc.ui.theme.basic": "^4.2.0-rc.2"
+ "@abp/aspnetcore.mvc.ui.theme.basic": "^4.2.1"
}
}
\ No newline at end of file
diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock
index 0118c5f1a3..a6ef25a362 100644
--- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock
+++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock
@@ -2,37 +2,37 @@
# yarn lockfile v1
-"@abp/aspnetcore.mvc.ui.theme.basic@^4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.2.0-rc.2.tgz#f4625e18fd3704d432913e9de59c7183770ea485"
- integrity sha512-wwOFcrICyhgAcBq7zgdIkYQ8Mov0g1iYrjoRZRiUzBYG4wkcAO9POM9asE6uvY5sD/hd0cRoXSZOcNKUt0J1SA==
- dependencies:
- "@abp/aspnetcore.mvc.ui.theme.shared" "~4.2.0-rc.2"
-
-"@abp/aspnetcore.mvc.ui.theme.shared@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.2.0-rc.2.tgz#9ff3af53b667e747c06d3f067a0f68a938ac72a8"
- integrity sha512-qsJ6UaUxyOJOHxsqVjlUGhCvQUnbXgGzLvFPJZYLpnWm6ZvE1KAgJnQHL46YSllCDT0meVqHt9byjOCRJUMm9Q==
- dependencies:
- "@abp/aspnetcore.mvc.ui" "~4.2.0-rc.2"
- "@abp/bootstrap" "~4.2.0-rc.2"
- "@abp/bootstrap-datepicker" "~4.2.0-rc.2"
- "@abp/datatables.net-bs4" "~4.2.0-rc.2"
- "@abp/font-awesome" "~4.2.0-rc.2"
- "@abp/jquery-form" "~4.2.0-rc.2"
- "@abp/jquery-validation-unobtrusive" "~4.2.0-rc.2"
- "@abp/lodash" "~4.2.0-rc.2"
- "@abp/luxon" "~4.2.0-rc.2"
- "@abp/malihu-custom-scrollbar-plugin" "~4.2.0-rc.2"
- "@abp/select2" "~4.2.0-rc.2"
- "@abp/sweetalert" "~4.2.0-rc.2"
- "@abp/timeago" "~4.2.0-rc.2"
- "@abp/toastr" "~4.2.0-rc.2"
-
-"@abp/aspnetcore.mvc.ui@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.2.0-rc.2.tgz#726f45c7ff12e69e970fb89b4adfb15502a11576"
- integrity sha512-EzTYQ8XzXIprfK95LyYc1Ci3to3dNlBOSzkkYfYDXkSR5/SyBKckCTd5FL4c7yrs+qBoJMxKWDyWz+pmf6PIJA==
+"@abp/aspnetcore.mvc.ui.theme.basic@^4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.2.1.tgz#78b465ab8fcd68a38e2b868717d00e5f5d3b0c61"
+ integrity sha512-Tb0g4mtdSsjQkadvnjjRjObEhweUvigto0BTv5SzRNi0oQLW8ZVUcFmuMWB09nJAIPrbuA3QuPUlXzFcv2gsdg==
+ dependencies:
+ "@abp/aspnetcore.mvc.ui.theme.shared" "~4.2.1"
+
+"@abp/aspnetcore.mvc.ui.theme.shared@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.2.1.tgz#18205c13f137dad9876c4153f34273a7c8e69854"
+ integrity sha512-+f54CysWpEKfxjIIjhnTKW0jJ0Rg+wS6yxb9Rg3qxA5iEUkxp3B+NB5wA9rT5YcY9APrwVpiw1miNRmq5ZvFXg==
+ dependencies:
+ "@abp/aspnetcore.mvc.ui" "~4.2.1"
+ "@abp/bootstrap" "~4.2.1"
+ "@abp/bootstrap-datepicker" "~4.2.1"
+ "@abp/datatables.net-bs4" "~4.2.1"
+ "@abp/font-awesome" "~4.2.1"
+ "@abp/jquery-form" "~4.2.1"
+ "@abp/jquery-validation-unobtrusive" "~4.2.1"
+ "@abp/lodash" "~4.2.1"
+ "@abp/luxon" "~4.2.1"
+ "@abp/malihu-custom-scrollbar-plugin" "~4.2.1"
+ "@abp/select2" "~4.2.1"
+ "@abp/sweetalert" "~4.2.1"
+ "@abp/timeago" "~4.2.1"
+ "@abp/toastr" "~4.2.1"
+
+"@abp/aspnetcore.mvc.ui@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.2.1.tgz#2ad368af731678213ff3d8448a3dd30a2f1f66c9"
+ integrity sha512-/a/KDVQ3EuETSSe+KqmsR24w6RWHvaokvmmOjL+tCpFQyeaYAZ88E9pvM5hC9HVR24FCHTiARiXwgMTw2eZFyQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@@ -43,145 +43,145 @@
micromatch "^4.0.2"
path "^0.12.7"
-"@abp/bootstrap-datepicker@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.2.0-rc.2.tgz#f2a6d013321c98f8c9a7533087360fce9a5fd074"
- integrity sha512-n3gLYLL7hHX83gurN5iRkpairrw0oAyg+Bc6SeIbNAdorun9wBJn7IlmvXxGPn1xK5iDKktRSeWJ885fMgkuWg==
+"@abp/bootstrap-datepicker@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.2.1.tgz#87fe913aa6923a39206f4481af3b02309e2cebd5"
+ integrity sha512-35uaM+OBUqsBBIF08NUu7XBVIgwVQIjJard92Px7eR0EJ2AW6f5hNlJQYfPkYVdmkPIpG16qWctICB+L2W3ZKA==
dependencies:
bootstrap-datepicker "^1.9.0"
-"@abp/bootstrap@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.2.0-rc.2.tgz#49250657f667f7553f3c2149fda43f7535de989b"
- integrity sha512-WYdyDQzgFlltxqdYINAMVWjXiiDAx780fTJEd3YKLSzxmVGBfoW4cfFzw8vr/G/EMYrgAPQtrIS+BRlFAJXXGQ==
+"@abp/bootstrap@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.2.1.tgz#12d8b0cddb5fca55888e01644ff49ed7d78069e9"
+ integrity sha512-1Z4atDgHDxesjBh5uPb442NALcUucS2Lt56CaN5UPBXQvAPr72cw4hfKbW08KJ0ab7WME0uCi1vYZFM28/zqTg==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
-"@abp/core@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.2.0-rc.2.tgz#dc18c3b8f294563ba62c000c026f5ceb86030456"
- integrity sha512-YJz4xUwb/mv/Xi/WuPz2SF/LD22P/UJ+psb+35ezOeuj020IAdaunk8LdrU5TfaZqNe5WpGszKMA+jO9ydNuqA==
+"@abp/core@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.2.1.tgz#1e74b0ffbc8c938e8de2f320594637910a09cbab"
+ integrity sha512-EiJSgUytS9Mrv8GZr9pwIzxwlrP82hEcS67cAgDxBc4QOhtMXhGZBMjDBHoIkOt6Db/ua0iPC700w0Utt5kWZQ==
dependencies:
- "@abp/utils" "^4.2.0-rc.2"
+ "@abp/utils" "^4.2.1"
-"@abp/datatables.net-bs4@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.2.0-rc.2.tgz#0d14886aa756ca707dd365b423b40d84c658268e"
- integrity sha512-kX+NrGkisy7IMi+xL69dPaPOYNLBZ4Vp7xCvJqNhdc5Sh6Rn1P0bLvxFKG065mBMfgW8tyFNnN3c5WzwcRFSmg==
+"@abp/datatables.net-bs4@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.2.1.tgz#fa6d711e6af352672879130a931fc2d27e5fd9e7"
+ integrity sha512-T66P74F58n4P5xwfhekriSr66A35okrXw61mlMXqeet8ACtxiM55MhXw89qvsL0qo5qG/a9d9MWPYNmZgXvKSQ==
dependencies:
- "@abp/datatables.net" "~4.2.0-rc.2"
+ "@abp/datatables.net" "~4.2.1"
datatables.net-bs4 "^1.10.21"
-"@abp/datatables.net@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.2.0-rc.2.tgz#a82ac16c1644a92d01ba63bf57e0d3784eb00f2f"
- integrity sha512-bEQ6QSUN65lJ8fK8wOVE16cayDI64EgyVb3qZAzWUncxPyLLa5s5zlDjcQ98D3An+x3tG2CdmEEWjlAgWdaf1g==
+"@abp/datatables.net@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.2.1.tgz#a5f3549b7b581619bbffb398b2172ed7789d0486"
+ integrity sha512-ZxpSW6PhJupjecTC25MEKTdjePvg2xNouqioL9L7V3lPJ6S3fsqNs9QFjFjpv0vltzXMaZgJTSuxilmR6s6piw==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
datatables.net "^1.10.21"
-"@abp/font-awesome@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.2.0-rc.2.tgz#6c72ef7ae00beda565e9836c8214ccf074ea7e4b"
- integrity sha512-bEQPGyVsKV7aQtVwG4UIcG+DMneBD7jcjX3eFqjOlGhQq3ODbNld5IPXHO+JnHDLt5NOzrePQLUzPhsvCIwhGA==
+"@abp/font-awesome@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.2.1.tgz#81d718b08a1f08bf35dd0887f9c6c9f1ea5416ee"
+ integrity sha512-kWAOqN7OtiBA7gd3VLH7pft1A5KYnJGJCn56xoqWIqLyHrSapwI5IMOojRDr+WhQJXk5EGE+rnmqRP51MYo4NQ==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
"@fortawesome/fontawesome-free" "^5.13.0"
-"@abp/jquery-form@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.2.0-rc.2.tgz#a4726794f78cf69dd75c0adda3dca3ed623f02d8"
- integrity sha512-rOGXYTTiQUD2HWTabh0+Ot6LX4PEObd3DW3ikBHZSnfen7W0OgnLdqNaunHYSEV3UUgCAZHaX0wQd4SM0pRMLg==
+"@abp/jquery-form@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.2.1.tgz#bbc21aafd88aa0f89619ce72fbafc917812d15e4"
+ integrity sha512-xnxaaOExhz7/8/P6XGvQuKitpuVjzoZz+r1Kr+W9gVy0dWZcCOfeVi4kdpxDFpqUmQJQJi0tvdVkFHx/hAkB7g==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
jquery-form "^4.3.0"
-"@abp/jquery-validation-unobtrusive@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.2.0-rc.2.tgz#5dee22e1bcbd44bd8e2584d37d79e8313cf615ec"
- integrity sha512-xk56Otr6PG/bED2yJuPo0OhwcgS4FQQXySgPD9e7mlZQcjxZ4LvmRU/btoNoxSHKYUBLKRfEOYOqRTxJhrH0eA==
+"@abp/jquery-validation-unobtrusive@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.2.1.tgz#36681e75e43e8f708bbd5d6e359eefd8dcce86df"
+ integrity sha512-STuVKdSUNjrW3q30GcszgzecHDdPmL3aA0jPsRJr0S2Wp5CQOe0dB7d5xyAnADIL68cPXjZWlz1OyXSQ2LixeQ==
dependencies:
- "@abp/jquery-validation" "~4.2.0-rc.2"
+ "@abp/jquery-validation" "~4.2.1"
jquery-validation-unobtrusive "^3.2.11"
-"@abp/jquery-validation@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.2.0-rc.2.tgz#594b9132d1eafebed60be10d219bc9e8b15f18b6"
- integrity sha512-LkNI3X7gpYYkI3DnCTZ1KIV6ykKMqw6pLZhFvTZz7GliZWE1jHtFos4U6lWe2XnMjnFeVeY6rPFM/1LaamfCKg==
+"@abp/jquery-validation@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.2.1.tgz#209b0acb500ac301bb66b3f04bc18b9c574e2fcf"
+ integrity sha512-g87I0nO7Jk2d4Jt7PlLk/bHu5xQFH4+mbHwH4oRLAzflDhRNtNB+uVF35HK/1shprmSlZt6X+bHz652SEqD81g==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
jquery-validation "^1.19.2"
-"@abp/jquery@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.2.0-rc.2.tgz#146589cbf4397be727d38798d557f3879ae51057"
- integrity sha512-yTYk5rRG3qnRKnA/pSXZNH/+KJcJ2Wo5BUtt3G8oKAe+no0Au1BoCV9j7JNiSnLXkFVWFuRwEZCh+cp6ngACng==
+"@abp/jquery@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.2.1.tgz#b8ed11cbc02d33cdc99cacbaf5089343a0f164c5"
+ integrity sha512-xcoSu/2qc2AEF+dCTNHTCWjAo1dIcohHVPM3Yh36bb+JEcnruYYRokqZc4pzkh0GQamE1eMVGi3QOAmuURtbCg==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
jquery "~3.5.1"
-"@abp/lodash@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.2.0-rc.2.tgz#f0a238991c288f439e2751938a39d434dd7883e7"
- integrity sha512-En9gZD8TDY8ZvZqHVsv3cP2EsRdPRsGD0ncUYOvlNG/sc+MZpRmZ+xOLws1wXS83IxGAxzPdCFEu0biJlyOyxg==
+"@abp/lodash@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.2.1.tgz#87b7f48cf494553f7cd43dddf625a90581555ae7"
+ integrity sha512-hDwzR/Q9GqXPdQaijQ3B4GIWZ8z9clCW9vU59qbELD8xBZIJalTSrUGnIT8YNB9O5tNFb2FWJJbw5Nh8K7lu1A==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
lodash "^4.17.15"
-"@abp/luxon@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.2.0-rc.2.tgz#ace30caacf6abcce1559b65046ea55e47e1cb8a2"
- integrity sha512-ivhOadlaeBh6Pi3S5Bo0pb4EPCEjMFL5N5tZXGGieZt7EnF+4uiXbKJVErXNCDtX1jhJT/3HGqmdxa+WynUE0A==
+"@abp/luxon@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.2.1.tgz#e29c1fe9903beb0fc4d32cab90a5de4ebc768e43"
+ integrity sha512-Sussnocvw75EbJ1j0Ohn7F+SBQy9xPbiG6RJExdDFzxhUNsVp5wJF2Jm8hOZB3DYkeGAOskY5RoIG0abfE/j3w==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
luxon "^1.24.1"
-"@abp/malihu-custom-scrollbar-plugin@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.2.0-rc.2.tgz#483668c09e13b0ebcea16320a16f8517fcdd53ee"
- integrity sha512-IYOwJcWyJkn/gdp4VkEYCv2Gi5+Boxe7pE7hA49gxgllHiFV0ABDFrRg4h8MbyJd80iwvVPo8t8ouvn4Snm+gQ==
+"@abp/malihu-custom-scrollbar-plugin@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.2.1.tgz#0c491d772ab0bb03d7eead0b9715bddb44252d56"
+ integrity sha512-qBnBMzj4G/dAMShmF4EXr55hkMehC1+cB6Jjl1wPHgMV8QPafznBKGyM6KWxGhrl8K6nCErBbidgQKpYqtWhNA==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
malihu-custom-scrollbar-plugin "^3.1.5"
-"@abp/select2@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.2.0-rc.2.tgz#d11e808dac90e09e14025b6ba6dabed683a9b1fb"
- integrity sha512-fENomkoAML+NQWvZ/ecjvqnXtvrzJKyChwj9Ul12c+Noi6boeuFDbhi/OG6qCrSzDnNBrehHVXBLFxT9sIL0OA==
+"@abp/select2@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.2.1.tgz#2f397cc1754135642385333bf47a1a106dd9b165"
+ integrity sha512-g1AUGof5daULbVFCokR9JS1/4gIpEWKB5/+rRJBmnje2hUgBA3llD5PCOh5WRHA7urJJOD/5BjWlFdozluUAyg==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
select2 "^4.0.13"
-"@abp/sweetalert@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.2.0-rc.2.tgz#2359eeb9e4b34c4cbb3aaed11136ea3d280bd677"
- integrity sha512-oQPj2vKPNAOvBECgJFdDwvJ8nwQ54ZPsAW1XS3XSkFz3YwWn4Xt9eZK6vecHloYckSckrFtsN/DSQI8ao/uIFg==
+"@abp/sweetalert@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.2.1.tgz#bdbc28c3f73b314b8ca792ea73390fe9f558c03f"
+ integrity sha512-xTi0oSjAkFMIDHgF8YB+oqFCl4gNfnt7mGHvEjJwpCEQSkuML9QsiGvw1TpXyHP7npOWSjjVpoyEBS2HXC778Q==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
sweetalert "^2.1.2"
-"@abp/timeago@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.2.0-rc.2.tgz#d243acff635978068ec579c83a34d0680616c5ef"
- integrity sha512-TF1dt9ro3BQnfVetDzbOkedSIncSwvPfnHKMY1xcLG2h0c6ke2PjDQ+4QJrtigggT4vfgmQtRrs/zJxjzWS7qw==
+"@abp/timeago@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.2.1.tgz#38474ed4455e94c687a3124e1a6e77c3b29a87d3"
+ integrity sha512-46+2plKizUcRn2VWN5WPWvwEVz+xoKOmsH1tEJ8WKKNxjeNRAsfeOslbfIEks89hTXLQemP3txAbq9V3E8pwQw==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
timeago "^1.6.7"
-"@abp/toastr@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.2.0-rc.2.tgz#4e76f4b7068f92b267b725ad597b8315e6b615bc"
- integrity sha512-UJVuQWc7py54JC35RrH+MwAZsOoOhejxX+3aonz8Io2rgFFj0YwK5U+vItRNM3iabSqTcIExcSD3XL2TmQyVzg==
+"@abp/toastr@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.2.1.tgz#9e30607f7ff7067588d0a660226d338003c37707"
+ integrity sha512-fdlMZjffEO/05aeG8BjTspARKGtUu2SpoFViTeHGhSPsCW55BvuehIgRhyOEQNfMqJz8m0cVR0R2q+WPFWf1XA==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
toastr "^2.1.4"
-"@abp/utils@^4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.2.0-rc.2.tgz#43c27d421da8e58a5d74c0a2df8742efa827c842"
- integrity sha512-6gSLTP9s88aFjxm+fU2iZMzv5Eoe5/va2PHTAoQJA4BaP/SpFRGts3cT4HYWPfAbmzZVZ+tvjuYd3P6d3FCAhw==
+"@abp/utils@^4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.2.1.tgz#1f5bfa7aae0065ec4dc38f1f5dc393b664c92d5c"
+ integrity sha512-V7XYC38u4C+UpXQr28KA1KHL5nNgDsFHfZULPnkwPxV8DuhzemmPYN3qmSXi5hfSfp+psNCX3GYZRMCI57kHgQ==
dependencies:
just-compare "^1.3.0"
diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json b/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json
index 807eaccef0..ba9e537bf4 100644
--- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json
+++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json
@@ -3,6 +3,6 @@
"name": "my-app",
"private": true,
"dependencies": {
- "@abp/aspnetcore.mvc.ui.theme.basic": "^4.2.0-rc.2"
+ "@abp/aspnetcore.mvc.ui.theme.basic": "^4.2.1"
}
}
\ No newline at end of file
diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock
index 0aff599aef..bb7b7ea2b0 100644
--- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock
+++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock
@@ -2,37 +2,37 @@
# yarn lockfile v1
-"@abp/aspnetcore.mvc.ui.theme.basic@^4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.2.0-rc.2.tgz#f4625e18fd3704d432913e9de59c7183770ea485"
- integrity sha512-wwOFcrICyhgAcBq7zgdIkYQ8Mov0g1iYrjoRZRiUzBYG4wkcAO9POM9asE6uvY5sD/hd0cRoXSZOcNKUt0J1SA==
- dependencies:
- "@abp/aspnetcore.mvc.ui.theme.shared" "~4.2.0-rc.2"
-
-"@abp/aspnetcore.mvc.ui.theme.shared@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.2.0-rc.2.tgz#9ff3af53b667e747c06d3f067a0f68a938ac72a8"
- integrity sha512-qsJ6UaUxyOJOHxsqVjlUGhCvQUnbXgGzLvFPJZYLpnWm6ZvE1KAgJnQHL46YSllCDT0meVqHt9byjOCRJUMm9Q==
- dependencies:
- "@abp/aspnetcore.mvc.ui" "~4.2.0-rc.2"
- "@abp/bootstrap" "~4.2.0-rc.2"
- "@abp/bootstrap-datepicker" "~4.2.0-rc.2"
- "@abp/datatables.net-bs4" "~4.2.0-rc.2"
- "@abp/font-awesome" "~4.2.0-rc.2"
- "@abp/jquery-form" "~4.2.0-rc.2"
- "@abp/jquery-validation-unobtrusive" "~4.2.0-rc.2"
- "@abp/lodash" "~4.2.0-rc.2"
- "@abp/luxon" "~4.2.0-rc.2"
- "@abp/malihu-custom-scrollbar-plugin" "~4.2.0-rc.2"
- "@abp/select2" "~4.2.0-rc.2"
- "@abp/sweetalert" "~4.2.0-rc.2"
- "@abp/timeago" "~4.2.0-rc.2"
- "@abp/toastr" "~4.2.0-rc.2"
-
-"@abp/aspnetcore.mvc.ui@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.2.0-rc.2.tgz#726f45c7ff12e69e970fb89b4adfb15502a11576"
- integrity sha512-EzTYQ8XzXIprfK95LyYc1Ci3to3dNlBOSzkkYfYDXkSR5/SyBKckCTd5FL4c7yrs+qBoJMxKWDyWz+pmf6PIJA==
+"@abp/aspnetcore.mvc.ui.theme.basic@^4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.2.1.tgz#78b465ab8fcd68a38e2b868717d00e5f5d3b0c61"
+ integrity sha512-Tb0g4mtdSsjQkadvnjjRjObEhweUvigto0BTv5SzRNi0oQLW8ZVUcFmuMWB09nJAIPrbuA3QuPUlXzFcv2gsdg==
+ dependencies:
+ "@abp/aspnetcore.mvc.ui.theme.shared" "~4.2.1"
+
+"@abp/aspnetcore.mvc.ui.theme.shared@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.2.1.tgz#18205c13f137dad9876c4153f34273a7c8e69854"
+ integrity sha512-+f54CysWpEKfxjIIjhnTKW0jJ0Rg+wS6yxb9Rg3qxA5iEUkxp3B+NB5wA9rT5YcY9APrwVpiw1miNRmq5ZvFXg==
+ dependencies:
+ "@abp/aspnetcore.mvc.ui" "~4.2.1"
+ "@abp/bootstrap" "~4.2.1"
+ "@abp/bootstrap-datepicker" "~4.2.1"
+ "@abp/datatables.net-bs4" "~4.2.1"
+ "@abp/font-awesome" "~4.2.1"
+ "@abp/jquery-form" "~4.2.1"
+ "@abp/jquery-validation-unobtrusive" "~4.2.1"
+ "@abp/lodash" "~4.2.1"
+ "@abp/luxon" "~4.2.1"
+ "@abp/malihu-custom-scrollbar-plugin" "~4.2.1"
+ "@abp/select2" "~4.2.1"
+ "@abp/sweetalert" "~4.2.1"
+ "@abp/timeago" "~4.2.1"
+ "@abp/toastr" "~4.2.1"
+
+"@abp/aspnetcore.mvc.ui@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.2.1.tgz#2ad368af731678213ff3d8448a3dd30a2f1f66c9"
+ integrity sha512-/a/KDVQ3EuETSSe+KqmsR24w6RWHvaokvmmOjL+tCpFQyeaYAZ88E9pvM5hC9HVR24FCHTiARiXwgMTw2eZFyQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@@ -43,145 +43,145 @@
micromatch "^4.0.2"
path "^0.12.7"
-"@abp/bootstrap-datepicker@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.2.0-rc.2.tgz#f2a6d013321c98f8c9a7533087360fce9a5fd074"
- integrity sha512-n3gLYLL7hHX83gurN5iRkpairrw0oAyg+Bc6SeIbNAdorun9wBJn7IlmvXxGPn1xK5iDKktRSeWJ885fMgkuWg==
+"@abp/bootstrap-datepicker@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.2.1.tgz#87fe913aa6923a39206f4481af3b02309e2cebd5"
+ integrity sha512-35uaM+OBUqsBBIF08NUu7XBVIgwVQIjJard92Px7eR0EJ2AW6f5hNlJQYfPkYVdmkPIpG16qWctICB+L2W3ZKA==
dependencies:
bootstrap-datepicker "^1.9.0"
-"@abp/bootstrap@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.2.0-rc.2.tgz#49250657f667f7553f3c2149fda43f7535de989b"
- integrity sha512-WYdyDQzgFlltxqdYINAMVWjXiiDAx780fTJEd3YKLSzxmVGBfoW4cfFzw8vr/G/EMYrgAPQtrIS+BRlFAJXXGQ==
+"@abp/bootstrap@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.2.1.tgz#12d8b0cddb5fca55888e01644ff49ed7d78069e9"
+ integrity sha512-1Z4atDgHDxesjBh5uPb442NALcUucS2Lt56CaN5UPBXQvAPr72cw4hfKbW08KJ0ab7WME0uCi1vYZFM28/zqTg==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
-"@abp/core@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.2.0-rc.2.tgz#dc18c3b8f294563ba62c000c026f5ceb86030456"
- integrity sha512-YJz4xUwb/mv/Xi/WuPz2SF/LD22P/UJ+psb+35ezOeuj020IAdaunk8LdrU5TfaZqNe5WpGszKMA+jO9ydNuqA==
+"@abp/core@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.2.1.tgz#1e74b0ffbc8c938e8de2f320594637910a09cbab"
+ integrity sha512-EiJSgUytS9Mrv8GZr9pwIzxwlrP82hEcS67cAgDxBc4QOhtMXhGZBMjDBHoIkOt6Db/ua0iPC700w0Utt5kWZQ==
dependencies:
- "@abp/utils" "^4.2.0-rc.2"
+ "@abp/utils" "^4.2.1"
-"@abp/datatables.net-bs4@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.2.0-rc.2.tgz#0d14886aa756ca707dd365b423b40d84c658268e"
- integrity sha512-kX+NrGkisy7IMi+xL69dPaPOYNLBZ4Vp7xCvJqNhdc5Sh6Rn1P0bLvxFKG065mBMfgW8tyFNnN3c5WzwcRFSmg==
+"@abp/datatables.net-bs4@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.2.1.tgz#fa6d711e6af352672879130a931fc2d27e5fd9e7"
+ integrity sha512-T66P74F58n4P5xwfhekriSr66A35okrXw61mlMXqeet8ACtxiM55MhXw89qvsL0qo5qG/a9d9MWPYNmZgXvKSQ==
dependencies:
- "@abp/datatables.net" "~4.2.0-rc.2"
+ "@abp/datatables.net" "~4.2.1"
datatables.net-bs4 "^1.10.21"
-"@abp/datatables.net@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.2.0-rc.2.tgz#a82ac16c1644a92d01ba63bf57e0d3784eb00f2f"
- integrity sha512-bEQ6QSUN65lJ8fK8wOVE16cayDI64EgyVb3qZAzWUncxPyLLa5s5zlDjcQ98D3An+x3tG2CdmEEWjlAgWdaf1g==
+"@abp/datatables.net@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.2.1.tgz#a5f3549b7b581619bbffb398b2172ed7789d0486"
+ integrity sha512-ZxpSW6PhJupjecTC25MEKTdjePvg2xNouqioL9L7V3lPJ6S3fsqNs9QFjFjpv0vltzXMaZgJTSuxilmR6s6piw==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
datatables.net "^1.10.21"
-"@abp/font-awesome@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.2.0-rc.2.tgz#6c72ef7ae00beda565e9836c8214ccf074ea7e4b"
- integrity sha512-bEQPGyVsKV7aQtVwG4UIcG+DMneBD7jcjX3eFqjOlGhQq3ODbNld5IPXHO+JnHDLt5NOzrePQLUzPhsvCIwhGA==
+"@abp/font-awesome@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.2.1.tgz#81d718b08a1f08bf35dd0887f9c6c9f1ea5416ee"
+ integrity sha512-kWAOqN7OtiBA7gd3VLH7pft1A5KYnJGJCn56xoqWIqLyHrSapwI5IMOojRDr+WhQJXk5EGE+rnmqRP51MYo4NQ==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
"@fortawesome/fontawesome-free" "^5.13.0"
-"@abp/jquery-form@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.2.0-rc.2.tgz#a4726794f78cf69dd75c0adda3dca3ed623f02d8"
- integrity sha512-rOGXYTTiQUD2HWTabh0+Ot6LX4PEObd3DW3ikBHZSnfen7W0OgnLdqNaunHYSEV3UUgCAZHaX0wQd4SM0pRMLg==
+"@abp/jquery-form@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.2.1.tgz#bbc21aafd88aa0f89619ce72fbafc917812d15e4"
+ integrity sha512-xnxaaOExhz7/8/P6XGvQuKitpuVjzoZz+r1Kr+W9gVy0dWZcCOfeVi4kdpxDFpqUmQJQJi0tvdVkFHx/hAkB7g==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
jquery-form "^4.3.0"
-"@abp/jquery-validation-unobtrusive@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.2.0-rc.2.tgz#5dee22e1bcbd44bd8e2584d37d79e8313cf615ec"
- integrity sha512-xk56Otr6PG/bED2yJuPo0OhwcgS4FQQXySgPD9e7mlZQcjxZ4LvmRU/btoNoxSHKYUBLKRfEOYOqRTxJhrH0eA==
+"@abp/jquery-validation-unobtrusive@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.2.1.tgz#36681e75e43e8f708bbd5d6e359eefd8dcce86df"
+ integrity sha512-STuVKdSUNjrW3q30GcszgzecHDdPmL3aA0jPsRJr0S2Wp5CQOe0dB7d5xyAnADIL68cPXjZWlz1OyXSQ2LixeQ==
dependencies:
- "@abp/jquery-validation" "~4.2.0-rc.2"
+ "@abp/jquery-validation" "~4.2.1"
jquery-validation-unobtrusive "^3.2.11"
-"@abp/jquery-validation@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.2.0-rc.2.tgz#594b9132d1eafebed60be10d219bc9e8b15f18b6"
- integrity sha512-LkNI3X7gpYYkI3DnCTZ1KIV6ykKMqw6pLZhFvTZz7GliZWE1jHtFos4U6lWe2XnMjnFeVeY6rPFM/1LaamfCKg==
+"@abp/jquery-validation@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.2.1.tgz#209b0acb500ac301bb66b3f04bc18b9c574e2fcf"
+ integrity sha512-g87I0nO7Jk2d4Jt7PlLk/bHu5xQFH4+mbHwH4oRLAzflDhRNtNB+uVF35HK/1shprmSlZt6X+bHz652SEqD81g==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
jquery-validation "^1.19.2"
-"@abp/jquery@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.2.0-rc.2.tgz#146589cbf4397be727d38798d557f3879ae51057"
- integrity sha512-yTYk5rRG3qnRKnA/pSXZNH/+KJcJ2Wo5BUtt3G8oKAe+no0Au1BoCV9j7JNiSnLXkFVWFuRwEZCh+cp6ngACng==
+"@abp/jquery@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.2.1.tgz#b8ed11cbc02d33cdc99cacbaf5089343a0f164c5"
+ integrity sha512-xcoSu/2qc2AEF+dCTNHTCWjAo1dIcohHVPM3Yh36bb+JEcnruYYRokqZc4pzkh0GQamE1eMVGi3QOAmuURtbCg==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
jquery "~3.5.1"
-"@abp/lodash@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.2.0-rc.2.tgz#f0a238991c288f439e2751938a39d434dd7883e7"
- integrity sha512-En9gZD8TDY8ZvZqHVsv3cP2EsRdPRsGD0ncUYOvlNG/sc+MZpRmZ+xOLws1wXS83IxGAxzPdCFEu0biJlyOyxg==
+"@abp/lodash@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.2.1.tgz#87b7f48cf494553f7cd43dddf625a90581555ae7"
+ integrity sha512-hDwzR/Q9GqXPdQaijQ3B4GIWZ8z9clCW9vU59qbELD8xBZIJalTSrUGnIT8YNB9O5tNFb2FWJJbw5Nh8K7lu1A==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
lodash "^4.17.15"
-"@abp/luxon@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.2.0-rc.2.tgz#ace30caacf6abcce1559b65046ea55e47e1cb8a2"
- integrity sha512-ivhOadlaeBh6Pi3S5Bo0pb4EPCEjMFL5N5tZXGGieZt7EnF+4uiXbKJVErXNCDtX1jhJT/3HGqmdxa+WynUE0A==
+"@abp/luxon@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.2.1.tgz#e29c1fe9903beb0fc4d32cab90a5de4ebc768e43"
+ integrity sha512-Sussnocvw75EbJ1j0Ohn7F+SBQy9xPbiG6RJExdDFzxhUNsVp5wJF2Jm8hOZB3DYkeGAOskY5RoIG0abfE/j3w==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
luxon "^1.24.1"
-"@abp/malihu-custom-scrollbar-plugin@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.2.0-rc.2.tgz#483668c09e13b0ebcea16320a16f8517fcdd53ee"
- integrity sha512-IYOwJcWyJkn/gdp4VkEYCv2Gi5+Boxe7pE7hA49gxgllHiFV0ABDFrRg4h8MbyJd80iwvVPo8t8ouvn4Snm+gQ==
+"@abp/malihu-custom-scrollbar-plugin@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.2.1.tgz#0c491d772ab0bb03d7eead0b9715bddb44252d56"
+ integrity sha512-qBnBMzj4G/dAMShmF4EXr55hkMehC1+cB6Jjl1wPHgMV8QPafznBKGyM6KWxGhrl8K6nCErBbidgQKpYqtWhNA==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
malihu-custom-scrollbar-plugin "^3.1.5"
-"@abp/select2@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.2.0-rc.2.tgz#d11e808dac90e09e14025b6ba6dabed683a9b1fb"
- integrity sha512-fENomkoAML+NQWvZ/ecjvqnXtvrzJKyChwj9Ul12c+Noi6boeuFDbhi/OG6qCrSzDnNBrehHVXBLFxT9sIL0OA==
+"@abp/select2@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.2.1.tgz#2f397cc1754135642385333bf47a1a106dd9b165"
+ integrity sha512-g1AUGof5daULbVFCokR9JS1/4gIpEWKB5/+rRJBmnje2hUgBA3llD5PCOh5WRHA7urJJOD/5BjWlFdozluUAyg==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
select2 "^4.0.13"
-"@abp/sweetalert@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.2.0-rc.2.tgz#2359eeb9e4b34c4cbb3aaed11136ea3d280bd677"
- integrity sha512-oQPj2vKPNAOvBECgJFdDwvJ8nwQ54ZPsAW1XS3XSkFz3YwWn4Xt9eZK6vecHloYckSckrFtsN/DSQI8ao/uIFg==
+"@abp/sweetalert@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.2.1.tgz#bdbc28c3f73b314b8ca792ea73390fe9f558c03f"
+ integrity sha512-xTi0oSjAkFMIDHgF8YB+oqFCl4gNfnt7mGHvEjJwpCEQSkuML9QsiGvw1TpXyHP7npOWSjjVpoyEBS2HXC778Q==
dependencies:
- "@abp/core" "~4.2.0-rc.2"
+ "@abp/core" "~4.2.1"
sweetalert "^2.1.2"
-"@abp/timeago@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.2.0-rc.2.tgz#d243acff635978068ec579c83a34d0680616c5ef"
- integrity sha512-TF1dt9ro3BQnfVetDzbOkedSIncSwvPfnHKMY1xcLG2h0c6ke2PjDQ+4QJrtigggT4vfgmQtRrs/zJxjzWS7qw==
+"@abp/timeago@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.2.1.tgz#38474ed4455e94c687a3124e1a6e77c3b29a87d3"
+ integrity sha512-46+2plKizUcRn2VWN5WPWvwEVz+xoKOmsH1tEJ8WKKNxjeNRAsfeOslbfIEks89hTXLQemP3txAbq9V3E8pwQw==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
timeago "^1.6.7"
-"@abp/toastr@~4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.2.0-rc.2.tgz#4e76f4b7068f92b267b725ad597b8315e6b615bc"
- integrity sha512-UJVuQWc7py54JC35RrH+MwAZsOoOhejxX+3aonz8Io2rgFFj0YwK5U+vItRNM3iabSqTcIExcSD3XL2TmQyVzg==
+"@abp/toastr@~4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.2.1.tgz#9e30607f7ff7067588d0a660226d338003c37707"
+ integrity sha512-fdlMZjffEO/05aeG8BjTspARKGtUu2SpoFViTeHGhSPsCW55BvuehIgRhyOEQNfMqJz8m0cVR0R2q+WPFWf1XA==
dependencies:
- "@abp/jquery" "~4.2.0-rc.2"
+ "@abp/jquery" "~4.2.1"
toastr "^2.1.4"
-"@abp/utils@^4.2.0-rc.2":
- version "4.2.0-rc.2"
- resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.2.0-rc.2.tgz#43c27d421da8e58a5d74c0a2df8742efa827c842"
- integrity sha512-6gSLTP9s88aFjxm+fU2iZMzv5Eoe5/va2PHTAoQJA4BaP/SpFRGts3cT4HYWPfAbmzZVZ+tvjuYd3P6d3FCAhw==
+"@abp/utils@^4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.2.1.tgz#1f5bfa7aae0065ec4dc38f1f5dc393b664c92d5c"
+ integrity sha512-V7XYC38u4C+UpXQr28KA1KHL5nNgDsFHfZULPnkwPxV8DuhzemmPYN3qmSXi5hfSfp+psNCX3GYZRMCI57kHgQ==
dependencies:
just-compare "^1.3.0"
diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210209082122_UrlSlugToSlug.Designer.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210209082122_UrlSlugToSlug.Designer.cs
new file mode 100644
index 0000000000..ef06bb2fd9
--- /dev/null
+++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20210209082122_UrlSlugToSlug.Designer.cs
@@ -0,0 +1,1891 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Volo.Abp.EntityFrameworkCore;
+using Volo.CmsKit.EntityFrameworkCore;
+
+namespace Volo.CmsKit.Migrations
+{
+ [DbContext(typeof(UnifiedDbContext))]
+ [Migration("20210209082122_UrlSlugToSlug")]
+ partial class UrlSlugToSlug
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .UseIdentityColumns()
+ .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer)
+ .HasAnnotation("Relational:MaxIdentifierLength", 128)
+ .HasAnnotation("ProductVersion", "5.0.2");
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ApplicationName")
+ .HasMaxLength(96)
+ .HasColumnType("nvarchar(96)")
+ .HasColumnName("ApplicationName");
+
+ b.Property("BrowserInfo")
+ .HasMaxLength(512)
+ .HasColumnType("nvarchar(512)")
+ .HasColumnName("BrowserInfo");
+
+ b.Property("ClientId")
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)")
+ .HasColumnName("ClientId");
+
+ b.Property("ClientIpAddress")
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)")
+ .HasColumnName("ClientIpAddress");
+
+ b.Property("ClientName")
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)")
+ .HasColumnName("ClientName");
+
+ b.Property("Comments")
+ .HasMaxLength(256)
+ .HasColumnType("nvarchar(256)")
+ .HasColumnName("Comments");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("nvarchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CorrelationId")
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)")
+ .HasColumnName("CorrelationId");
+
+ b.Property("Exceptions")
+ .HasMaxLength(4000)
+ .HasColumnType("nvarchar(4000)")
+ .HasColumnName("Exceptions");
+
+ b.Property("ExecutionDuration")
+ .HasColumnType("int")
+ .HasColumnName("ExecutionDuration");
+
+ b.Property("ExecutionTime")
+ .HasColumnType("datetime2");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("HttpMethod")
+ .HasMaxLength(16)
+ .HasColumnType("nvarchar(16)")
+ .HasColumnName("HttpMethod");
+
+ b.Property("HttpStatusCode")
+ .HasColumnType("int")
+ .HasColumnName("HttpStatusCode");
+
+ b.Property("ImpersonatorTenantId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("ImpersonatorTenantId");
+
+ b.Property("ImpersonatorUserId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("ImpersonatorUserId");
+
+ b.Property("TenantId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("TenantId");
+
+ b.Property("TenantName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Url")
+ .HasMaxLength(256)
+ .HasColumnType("nvarchar(256)")
+ .HasColumnName("Url");
+
+ b.Property("UserId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("UserId");
+
+ b.Property("UserName")
+ .HasMaxLength(256)
+ .HasColumnType("nvarchar(256)")
+ .HasColumnName("UserName");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TenantId", "ExecutionTime");
+
+ b.HasIndex("TenantId", "UserId", "ExecutionTime");
+
+ b.ToTable("AbpAuditLogs");
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("AuditLogId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("AuditLogId");
+
+ b.Property("ExecutionDuration")
+ .HasColumnType("int")
+ .HasColumnName("ExecutionDuration");
+
+ b.Property("ExecutionTime")
+ .HasColumnType("datetime2")
+ .HasColumnName("ExecutionTime");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("MethodName")
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)")
+ .HasColumnName("MethodName");
+
+ b.Property("Parameters")
+ .HasMaxLength(2000)
+ .HasColumnType("nvarchar(2000)")
+ .HasColumnName("Parameters");
+
+ b.Property("ServiceName")
+ .HasMaxLength(256)
+ .HasColumnType("nvarchar(256)")
+ .HasColumnName("ServiceName");
+
+ b.Property("TenantId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AuditLogId");
+
+ b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime");
+
+ b.ToTable("AbpAuditLogActions");
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("AuditLogId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("AuditLogId");
+
+ b.Property("ChangeTime")
+ .HasColumnType("datetime2")
+ .HasColumnName("ChangeTime");
+
+ b.Property("ChangeType")
+ .HasColumnType("tinyint")
+ .HasColumnName("ChangeType");
+
+ b.Property("EntityId")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)")
+ .HasColumnName("EntityId");
+
+ b.Property