From b978ba4bf96751bdf37e4ebec98b84a7891c1714 Mon Sep 17 00:00:00 2001 From: liangshiw Date: Sun, 29 Dec 2019 22:10:28 +0800 Subject: [PATCH 1/6] Translate settings document --- docs/zh-Hans/Settings.md | 51 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/docs/zh-Hans/Settings.md b/docs/zh-Hans/Settings.md index 7b5d7fbd35..25559082f2 100644 --- a/docs/zh-Hans/Settings.md +++ b/docs/zh-Hans/Settings.md @@ -40,6 +40,33 @@ ABP会自动发现并注册设置的定义. * **Providers**: 限制可用于特定的设置值提供程序(参阅设置值提供程序部分了解更多). * **Properties**: 设置此值的自定义属性 名称/值 集合,可以在之后的应用程序代码中使用. +### 更改依赖模块的设置定义 + +在某些情况下,你可能希望更改应用程序/模块所依赖的其他模块中定义的设置的某些属性. 设置定义提供程序可以查询和更新设置定义. + +下面的示例中获取了由 [Volo.Abp.Emailing](Emailing.md) 包定义的设置并将其更改: + +````csharp +public class MySettingDefinitionProvider : SettingDefinitionProvider +{ + public override void Define(ISettingDefinitionContext context) + { + var smtpHost = context.GetOrNull("Abp.Mailing.Smtp.Host"); + if (smtpHost != null) + { + smtpHost.DefaultValue = "mail.mydomain.com"; + smtpHost.DisplayName = + new LocalizableString( + typeof(MyLocalizationResource), + "SmtpServer_DisplayName" + ); + } + } +} +```` + +> 使用常量作为设置名称是一种好习惯,ABP的包就是这样做的. `Abp.Mailing.Smtp`设置名称是在`EmailSettingNames`类(在Volo.Abp.Emailing名称空间中)定义的常量. + ## 读取设置值 ### ISettingProvider @@ -118,6 +145,30 @@ var requireDigit = abp.setting.getBoolean('Abp.Identity.Password.RequireDigit'); 全局,租户和用户设置值提供程序使用 `ISettingStore` 从数据源读取值(参见下面的小节). +### 在应用程序配置中设置值 + +上一节提到 `ConfigurationSettingValueProvider` 从 `IConfiguration` 服务中读取设置, 该服务默认从 `appsettings.json` 中读取值. 所以在 `appsettings.json` 文件中配置设置值是最简单的方式. + +例如你可以像以下方式一样配置 [IEmailSender](Emailing.md) 设置: + +````json +{ + "Settings": { + "Abp.Mailing.DefaultFromAddress": "noreply@mydomain.com", + "Abp.Mailing.DefaultFromDisplayName": "My Application", + "Abp.Mailing.Smtp.Host": "mail.mydomain.com", + "Abp.Mailing.Smtp.Port": "547", + "Abp.Mailing.Smtp.UserName": "myusername", + "Abp.Mailing.Smtp.Password": "mySecretPassW00rd", + "Abp.Mailing.Smtp.EnableSsl": "True" + } +} +```` + +设置值应该在 `Settings` 部分配置,如本例所示. + +> `IConfiguration`是.NET Core的服务,它不仅可以从 `appsettings.json` 中读取值,还可以从环境,用户机密...等中读取值. 有关更多信息请参阅[微软文档](https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/configuration/). + ### 自定义设置值提供程序 扩展设置系统的方式是定义一个派生自 `SettingValueProvider` 的类. 示例: From e3efdbb7c11fce14e5d045202a182450e97ae90c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 29 Dec 2019 19:09:13 +0300 Subject: [PATCH 2/6] Resolved #2499: Move AbpValidationResource to Volo.Abp.Validation package. --- .../Volo/Abp/Localization/AbpLocalizationModule.cs | 7 ------- .../Abp/Localization/LocalizationSettingProvider.cs | 4 ++-- .../AbpLocalization/AbpLocalizationResource.cs | 4 +--- .../AbpValidation/AbpValidationResource.cs | 13 ------------- .../Volo.Abp.Validation/Volo.Abp.Validation.csproj | 1 - .../AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs | 2 +- .../Account/AbpAccountApplicationContractsModule.cs | 2 +- .../Volo.Abp.Account.Application.Tests.csproj | 1 + .../Volo/Abp/Account/AccountAppService_Tests.cs | 5 ++--- .../Volo.Abp.AuditLogging.Domain.Shared.csproj | 1 - .../AbpAuditLoggingDomainSharedModule.cs | 3 +-- .../Abp/AuditLogging/AuditLogRepository_Tests.cs | 2 -- .../Volo.Blogging.Domain.Shared.csproj | 2 +- .../Volo/Blogging/BloggingDomainSharedModule.cs | 5 +++-- modules/docs/app/VoloDocs.Web/VoloDocsWebModule.cs | 2 +- .../src/Volo.Docs.Admin.Web/DocsAdminWebModule.cs | 6 +----- .../Volo.Abp.FeatureManagement.Domain.Shared.csproj | 2 +- .../AbpFeatureManagementDomainSharedModule.cs | 5 +++-- .../Volo.Abp.Identity.Domain.Shared.csproj | 2 +- .../Abp/Identity/AbpIdentityDomainSharedModule.cs | 9 ++++++--- .../Volo.Abp.IdentityServer.Domain.Shared.csproj | 2 +- .../AbpIdentityServerDomainSharedModule.cs | 5 +++-- ...lo.Abp.PermissionManagement.Domain.Shared.csproj | 2 +- .../AbpPermissionManagementDomainSharedModule.cs | 5 +++-- .../AbpPermissionManagementWebModule.cs | 5 +---- .../Volo.Abp.TenantManagement.Domain.Shared.csproj | 2 +- .../AbpTenantManagementDomainSharedModule.cs | 4 +++- .../AbpTenantManagementWebModule.cs | 6 +----- .../MyProjectNameDomainSharedModule.cs | 2 +- .../MyProjectNameWebTestModule.cs | 2 +- ...MyCompanyName.MyProjectName.Domain.Shared.csproj | 2 +- .../MyProjectNameDomainSharedModule.cs | 5 +++-- 32 files changed, 46 insertions(+), 74 deletions(-) delete mode 100644 framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Resources/AbpValidation/AbpValidationResource.cs diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs index 175e3f9d12..be39960b4f 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs @@ -1,5 +1,4 @@ using Volo.Abp.Localization.Resources.AbpLocalization; -using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; using Volo.Abp.Settings; using Volo.Abp.VirtualFileSystem; @@ -28,12 +27,6 @@ namespace Volo.Abp.Localization .Resources .Add("en"); - //TODO: Obsolete, Remove in the future version - options - .Resources - .Add("en") - .AddVirtualJson("/Volo/Abp/Validation/Localization");//load from Volo.Abp.Validation - options .Resources .Add("en") diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationSettingProvider.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationSettingProvider.cs index 14afe69dac..127d2550dd 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationSettingProvider.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationSettingProvider.cs @@ -1,4 +1,4 @@ -using Volo.Abp.Localization.Resources.AbpValidation; +using Volo.Abp.Localization.Resources.AbpLocalization; using Volo.Abp.Settings; namespace Volo.Abp.Localization @@ -18,7 +18,7 @@ namespace Volo.Abp.Localization private static LocalizableString L(string name) { - return LocalizableString.Create(name); + return LocalizableString.Create(name); } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Resources/AbpLocalization/AbpLocalizationResource.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Resources/AbpLocalization/AbpLocalizationResource.cs index abfd1688b7..7e3b5400c9 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Resources/AbpLocalization/AbpLocalizationResource.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Resources/AbpLocalization/AbpLocalizationResource.cs @@ -1,6 +1,4 @@ -using System; - -namespace Volo.Abp.Localization.Resources.AbpLocalization +namespace Volo.Abp.Localization.Resources.AbpLocalization { [LocalizationResourceName("AbpLocalization")] public class AbpLocalizationResource diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Resources/AbpValidation/AbpValidationResource.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Resources/AbpValidation/AbpValidationResource.cs deleted file mode 100644 index 5d0151fe66..0000000000 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Resources/AbpValidation/AbpValidationResource.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace Volo.Abp.Localization.Resources.AbpValidation -{ - //TODO: Move to Volo.Abp.Validation! - - [LocalizationResourceName("AbpValidation")] - [Obsolete("This resource is obsolete.Use Volo.Abp.Validation.Localization.AbpValidationResource instead.", false)] - public class AbpValidationResource - { - - } -} diff --git a/framework/src/Volo.Abp.Validation/Volo.Abp.Validation.csproj b/framework/src/Volo.Abp.Validation/Volo.Abp.Validation.csproj index 9e1e81b1d9..86017b9628 100644 --- a/framework/src/Volo.Abp.Validation/Volo.Abp.Validation.csproj +++ b/framework/src/Volo.Abp.Validation/Volo.Abp.Validation.csproj @@ -19,7 +19,6 @@ - diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs index 97055d1e9a..5e74ec4bfa 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs @@ -8,10 +8,10 @@ using Volo.Abp.AspNetCore.Mvc.Localization.Resource; using Volo.Abp.AspNetCore.TestBase; using Volo.Abp.Autofac; using Volo.Abp.Localization; -using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.MemoryDb; using Volo.Abp.Modularity; using Volo.Abp.TestApp; +using Volo.Abp.Validation.Localization; using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.AspNetCore.Mvc diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/AbpAccountApplicationContractsModule.cs b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/AbpAccountApplicationContractsModule.cs index 1d3ced4cdb..ee1b6c7957 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/AbpAccountApplicationContractsModule.cs +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/AbpAccountApplicationContractsModule.cs @@ -2,8 +2,8 @@ using Volo.Abp.Identity; using Volo.Abp.Localization; using Volo.Abp.Localization.ExceptionHandling; -using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; +using Volo.Abp.Validation.Localization; using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.Account diff --git a/modules/account/test/Volo.Abp.Account.Application.Tests/Volo.Abp.Account.Application.Tests.csproj b/modules/account/test/Volo.Abp.Account.Application.Tests/Volo.Abp.Account.Application.Tests.csproj index e8d3f84ead..2055dfc4ef 100644 --- a/modules/account/test/Volo.Abp.Account.Application.Tests/Volo.Abp.Account.Application.Tests.csproj +++ b/modules/account/test/Volo.Abp.Account.Application.Tests/Volo.Abp.Account.Application.Tests.csproj @@ -2,6 +2,7 @@ netcoreapp3.1 + diff --git a/modules/account/test/Volo.Abp.Account.Application.Tests/Volo/Abp/Account/AccountAppService_Tests.cs b/modules/account/test/Volo.Abp.Account.Application.Tests/Volo/Abp/Account/AccountAppService_Tests.cs index 634cbfc253..b11d19b7a6 100644 --- a/modules/account/test/Volo.Abp.Account.Application.Tests/Volo/Abp/Account/AccountAppService_Tests.cs +++ b/modules/account/test/Volo.Abp.Account.Application.Tests/Volo/Abp/Account/AccountAppService_Tests.cs @@ -4,7 +4,7 @@ using Shouldly; using Volo.Abp.Identity; using Xunit; -namespace Volo.Abp.Account.Pro.Application.Tests.Volo.Abp.Account +namespace Volo.Abp.Account { public class AccountAppService_Tests : AbpAccountApplicationTestBase { @@ -12,8 +12,7 @@ namespace Volo.Abp.Account.Pro.Application.Tests.Volo.Abp.Account private readonly IIdentityUserRepository _identityUserRepository; private readonly ILookupNormalizer _lookupNormalizer; private readonly IdentityUserManager _userManager; - - + public AccountAppService_Tests() { _accountAppService = GetRequiredService(); diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo.Abp.AuditLogging.Domain.Shared.csproj b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo.Abp.AuditLogging.Domain.Shared.csproj index b1d7f04bbf..44c36fd1d1 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo.Abp.AuditLogging.Domain.Shared.csproj +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo.Abp.AuditLogging.Domain.Shared.csproj @@ -8,7 +8,6 @@ - diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AbpAuditLoggingDomainSharedModule.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AbpAuditLoggingDomainSharedModule.cs index efa043efd1..ca0209a620 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AbpAuditLoggingDomainSharedModule.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AbpAuditLoggingDomainSharedModule.cs @@ -1,5 +1,4 @@ -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.AuditLogging.Localization; +using Volo.Abp.AuditLogging.Localization; using Volo.Abp.Localization; using Volo.Abp.Modularity; diff --git a/modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo/Abp/AuditLogging/AuditLogRepository_Tests.cs b/modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo/Abp/AuditLogging/AuditLogRepository_Tests.cs index 54092ea248..7ea6f4e0db 100644 --- a/modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo/Abp/AuditLogging/AuditLogRepository_Tests.cs +++ b/modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo/Abp/AuditLogging/AuditLogRepository_Tests.cs @@ -1,9 +1,7 @@ using System; using System.Collections.Generic; -using System.Globalization; using System.Linq; using System.Net; -using System.Text; using System.Threading.Tasks; using Shouldly; using Volo.Abp.Auditing; diff --git a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo.Blogging.Domain.Shared.csproj b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo.Blogging.Domain.Shared.csproj index e466b4dc99..c71ae5aef5 100644 --- a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo.Blogging.Domain.Shared.csproj +++ b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo.Blogging.Domain.Shared.csproj @@ -15,7 +15,7 @@ - + diff --git a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/BloggingDomainSharedModule.cs b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/BloggingDomainSharedModule.cs index 14dc9bd5ca..5cdd272a20 100644 --- a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/BloggingDomainSharedModule.cs +++ b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/BloggingDomainSharedModule.cs @@ -1,12 +1,13 @@ using Volo.Abp.Localization; -using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; +using Volo.Abp.Validation; +using Volo.Abp.Validation.Localization; using Volo.Blogging.Localization; using Volo.Abp.VirtualFileSystem; namespace Volo.Blogging { - [DependsOn(typeof(AbpLocalizationModule))] + [DependsOn(typeof(AbpValidationModule))] public class BloggingDomainSharedModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) diff --git a/modules/docs/app/VoloDocs.Web/VoloDocsWebModule.cs b/modules/docs/app/VoloDocs.Web/VoloDocsWebModule.cs index 189689064a..3e37206f31 100644 --- a/modules/docs/app/VoloDocs.Web/VoloDocsWebModule.cs +++ b/modules/docs/app/VoloDocs.Web/VoloDocsWebModule.cs @@ -18,7 +18,6 @@ using Volo.Abp.EntityFrameworkCore; using Volo.Abp.Identity; using Volo.Abp.Identity.Web; using Volo.Abp.Localization; -using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; using Volo.Abp.PermissionManagement; using Volo.Abp.PermissionManagement.Identity; @@ -32,6 +31,7 @@ using VoloDocs.EntityFrameworkCore; using Localization.Resources.AbpUi; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Hosting; +using Volo.Abp.Validation.Localization; namespace VoloDocs.Web { diff --git a/modules/docs/src/Volo.Docs.Admin.Web/DocsAdminWebModule.cs b/modules/docs/src/Volo.Docs.Admin.Web/DocsAdminWebModule.cs index de404a5884..1224b4371f 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/DocsAdminWebModule.cs +++ b/modules/docs/src/Volo.Docs.Admin.Web/DocsAdminWebModule.cs @@ -1,12 +1,8 @@ -using Localization.Resources.AbpUi; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; using Volo.Abp.AutoMapper; -using Volo.Abp.Localization; -using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; -using Volo.Abp.UI; using Volo.Abp.UI.Navigation; using Volo.Abp.VirtualFileSystem; using Volo.Docs.Admin.Navigation; diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo.Abp.FeatureManagement.Domain.Shared.csproj b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo.Abp.FeatureManagement.Domain.Shared.csproj index 5990dc210c..bfa20270c8 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo.Abp.FeatureManagement.Domain.Shared.csproj +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo.Abp.FeatureManagement.Domain.Shared.csproj @@ -13,7 +13,7 @@ - + diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainSharedModule.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainSharedModule.cs index f91fe28e5f..0c9a2e0f26 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainSharedModule.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainSharedModule.cs @@ -1,13 +1,14 @@ using Volo.Abp.FeatureManagement.Localization; using Volo.Abp.Localization; -using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; +using Volo.Abp.Validation; +using Volo.Abp.Validation.Localization; using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.FeatureManagement { [DependsOn( - typeof(AbpLocalizationModule) + typeof(AbpValidationModule) )] public class AbpFeatureManagementDomainSharedModule : AbpModule { diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo.Abp.Identity.Domain.Shared.csproj b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo.Abp.Identity.Domain.Shared.csproj index 6b58f2e433..460f5285e4 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo.Abp.Identity.Domain.Shared.csproj +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo.Abp.Identity.Domain.Shared.csproj @@ -20,7 +20,7 @@ - + diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/AbpIdentityDomainSharedModule.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/AbpIdentityDomainSharedModule.cs index 5133e0dc03..4bff33d58a 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/AbpIdentityDomainSharedModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/AbpIdentityDomainSharedModule.cs @@ -1,15 +1,18 @@ using Volo.Abp.Identity.Localization; using Volo.Abp.Localization; using Volo.Abp.Localization.ExceptionHandling; -using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; using Volo.Abp.Users; +using Volo.Abp.Validation; +using Volo.Abp.Validation.Localization; using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.Identity { - [DependsOn(typeof(AbpUsersDomainSharedModule))] - [DependsOn(typeof(AbpLocalizationModule))] + [DependsOn( + typeof(AbpUsersDomainSharedModule), + typeof(AbpValidationModule) + )] public class AbpIdentityDomainSharedModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo.Abp.IdentityServer.Domain.Shared.csproj b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo.Abp.IdentityServer.Domain.Shared.csproj index bcd99cd524..71d99b826b 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo.Abp.IdentityServer.Domain.Shared.csproj +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo.Abp.IdentityServer.Domain.Shared.csproj @@ -22,7 +22,7 @@ - + diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/AbpIdentityServerDomainSharedModule.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/AbpIdentityServerDomainSharedModule.cs index 983ffcb071..d56968ba5d 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/AbpIdentityServerDomainSharedModule.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/AbpIdentityServerDomainSharedModule.cs @@ -1,14 +1,15 @@ using Volo.Abp.IdentityServer.Localization; using Volo.Abp.Localization; using Volo.Abp.Localization.ExceptionHandling; -using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; +using Volo.Abp.Validation; +using Volo.Abp.Validation.Localization; using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.IdentityServer { [DependsOn( - typeof(AbpLocalizationModule) + typeof(AbpValidationModule) )] public class AbpIdentityServerDomainSharedModule : AbpModule { diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.csproj b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.csproj index fd4d602045..ff0ba6fbee 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.csproj +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.csproj @@ -19,7 +19,7 @@ - + diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/AbpPermissionManagementDomainSharedModule.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/AbpPermissionManagementDomainSharedModule.cs index 210ff6affc..b1d2c59a73 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/AbpPermissionManagementDomainSharedModule.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/AbpPermissionManagementDomainSharedModule.cs @@ -1,13 +1,14 @@ using Volo.Abp.Localization; -using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; using Volo.Abp.PermissionManagement.Localization; +using Volo.Abp.Validation; +using Volo.Abp.Validation.Localization; using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.PermissionManagement { [DependsOn( - typeof(AbpLocalizationModule) + typeof(AbpValidationModule) )] public class AbpPermissionManagementDomainSharedModule : AbpModule { diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/AbpPermissionManagementWebModule.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/AbpPermissionManagementWebModule.cs index cf1c3f13b1..c7f4e08480 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/AbpPermissionManagementWebModule.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/AbpPermissionManagementWebModule.cs @@ -1,10 +1,7 @@ -using Localization.Resources.AbpUi; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; using Volo.Abp.AutoMapper; -using Volo.Abp.Localization; -using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; using Volo.Abp.PermissionManagement.HttpApi; using Volo.Abp.PermissionManagement.Localization; diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo.Abp.TenantManagement.Domain.Shared.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo.Abp.TenantManagement.Domain.Shared.csproj index dec1cabd46..5cdaa28369 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo.Abp.TenantManagement.Domain.Shared.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo.Abp.TenantManagement.Domain.Shared.csproj @@ -19,7 +19,7 @@ - + diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/AbpTenantManagementDomainSharedModule.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/AbpTenantManagementDomainSharedModule.cs index 2058ae5425..158a78b0cb 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/AbpTenantManagementDomainSharedModule.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/AbpTenantManagementDomainSharedModule.cs @@ -1,11 +1,13 @@ using Volo.Abp.Localization; -using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; using Volo.Abp.TenantManagement.Localization; +using Volo.Abp.Validation; +using Volo.Abp.Validation.Localization; using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.TenantManagement { + [DependsOn(typeof(AbpValidationModule))] public class AbpTenantManagementDomainSharedModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs index a3f066594e..0094b7d5ad 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs @@ -1,13 +1,9 @@ -using Localization.Resources.AbpUi; -using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; using Volo.Abp.AutoMapper; using Volo.Abp.FeatureManagement; -using Volo.Abp.FeatureManagement.Localization; -using Volo.Abp.Localization; -using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; using Volo.Abp.TenantManagement.Localization; using Volo.Abp.TenantManagement.Web.Navigation; diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs index 38e95a5d4b..f20fb70a7e 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs @@ -5,11 +5,11 @@ using Volo.Abp.FeatureManagement; using Volo.Abp.Identity; using Volo.Abp.IdentityServer; using Volo.Abp.Localization; -using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; using Volo.Abp.PermissionManagement; using Volo.Abp.SettingManagement; using Volo.Abp.TenantManagement; +using Volo.Abp.Validation.Localization; using Volo.Abp.VirtualFileSystem; namespace MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/MyProjectNameWebTestModule.cs b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/MyProjectNameWebTestModule.cs index 78efb08262..f3998e71dc 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/MyProjectNameWebTestModule.cs +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/MyProjectNameWebTestModule.cs @@ -13,9 +13,9 @@ using MyCompanyName.MyProjectName.Web.Menus; using Volo.Abp; using Volo.Abp.AspNetCore.TestBase; using Volo.Abp.Localization; -using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; using Volo.Abp.UI.Navigation; +using Volo.Abp.Validation.Localization; namespace MyCompanyName.MyProjectName { diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj index 6cb4f837a1..6afc84fe77 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj @@ -8,7 +8,7 @@ - + diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs index 2d22b07cdf..384aae162a 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs @@ -2,13 +2,14 @@ using Volo.Abp.Localization; using MyCompanyName.MyProjectName.Localization; using Volo.Abp.Localization.ExceptionHandling; -using Volo.Abp.Localization.Resources.AbpValidation; +using Volo.Abp.Validation; +using Volo.Abp.Validation.Localization; using Volo.Abp.VirtualFileSystem; namespace MyCompanyName.MyProjectName { [DependsOn( - typeof(AbpLocalizationModule) + typeof(AbpValidationModule) )] public class MyProjectNameDomainSharedModule : AbpModule { From 518fb6acdcef4a668f4d2509504a7b29a51b3841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 29 Dec 2019 19:13:49 +0300 Subject: [PATCH 3/6] Fix AbpIoLocalizationModule for #2499 --- .../AbpIoLocalization/AbpIoLocalization.csproj | 2 +- .../AbpIoLocalization/AbpIoLocalizationModule.cs | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/AbpIoLocalization.csproj b/abp_io/AbpIoLocalization/AbpIoLocalization/AbpIoLocalization.csproj index 7c8af93c47..aaebfafe6f 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/AbpIoLocalization.csproj +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/AbpIoLocalization.csproj @@ -5,7 +5,7 @@ - + diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/AbpIoLocalizationModule.cs b/abp_io/AbpIoLocalization/AbpIoLocalization/AbpIoLocalizationModule.cs index 19c707bfad..37541b4d4c 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/AbpIoLocalizationModule.cs +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/AbpIoLocalizationModule.cs @@ -8,13 +8,14 @@ using AbpIoLocalization.Support.Localization; using AbpIoLocalization.Www; using Volo.Abp.Localization; using Volo.Abp.Localization.ExceptionHandling; -using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; +using Volo.Abp.Validation; +using Volo.Abp.Validation.Localization; using Volo.Abp.VirtualFileSystem; namespace AbpIoLocalization { - [DependsOn(typeof(AbpLocalizationModule))] + [DependsOn(typeof(AbpValidationModule))] public class AbpIoLocalizationModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) From a4e20048afff06b9bb3006e936f4e9b3a1d7f9ff Mon Sep 17 00:00:00 2001 From: Alper Ebicoglu Date: Sun, 29 Dec 2019 20:45:06 +0300 Subject: [PATCH 4/6] closes volosoft/volo#760 --- .../Volo.Abp.Cli.Core/Volo/Abp/Cli/CliUrls.cs | 11 ++- .../Volo/Abp/Cli/Commands/SuiteCommand.cs | 11 --- .../Abp/Cli/Licensing/AbpIoApiKeyService.cs | 37 +++++++-- .../Volo/Abp/Cli/Licensing/IApiKeyService.cs | 2 +- .../Volo/Abp/Cli/NuGet/NuGetService.cs | 80 ++++++++++++++++--- .../VoloNugetPackagesVersionUpdater.cs | 57 ++++++++++--- 6 files changed, 158 insertions(+), 40 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliUrls.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliUrls.cs index 3081c77cb5..8c4c8c01f2 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliUrls.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliUrls.cs @@ -4,9 +4,9 @@ { #if DEBUG public const string WwwAbpIo = "https://localhost:44328/"; - + public const string AccountAbpIo = "https://localhost:44333/"; - + public const string NuGetRootPath = "https://localhost:44373/"; #else public const string WwwAbpIo = "https://abp.io/"; @@ -18,7 +18,12 @@ public static string GetNuGetServiceIndexUrl(string apiKey) { - return NuGetRootPath + apiKey + "/v3/index.json"; + return $"{NuGetRootPath}{apiKey}/v3/index.json"; + } + + public static string GetNuGetPackageInfoUrl(string apiKey, string packageId) + { + return $"{NuGetRootPath}{apiKey}/v3/package/{packageId}/index.json"; } } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs index a47a865617..d57b394923 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs @@ -107,17 +107,6 @@ namespace Volo.Abp.Cli.Commands private async Task GetNuGetIndexUrlAsync() { var apiKeyResult = await _apiKeyService.GetApiKeyOrNullAsync(); - - if (apiKeyResult == null || string.IsNullOrEmpty(apiKeyResult.ApiKey)) - { - Logger.LogError("Couldn't retrieve your NuGet API key!"); - Logger.LogWarning(File.Exists(CliPaths.AccessToken) - ? "Make sure you have an active session and license on commercial.abp.io. To re-sign in you can use the CLI command \"abp login \"." - : "You are not signed in to commercial.abp.io. Use the CLI command \"abp login \" to sign in."); - - return null; - } - return CliUrls.GetNuGetServiceIndexUrl(apiKeyResult.ApiKey); } 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 1b9539d012..0c939c240a 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 @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Net; using System.Net.Http; using System.Threading.Tasks; @@ -19,6 +20,7 @@ namespace Volo.Abp.Cli.Licensing protected IJsonSerializer JsonSerializer { get; } protected IRemoteServiceExceptionHandler RemoteServiceExceptionHandler { get; } private readonly ILogger _logger; + private DeveloperApiKeyResult _apiKeyResult = null; public AbpIoApiKeyService(IJsonSerializer jsonSerializer, IRemoteServiceExceptionHandler remoteServiceExceptionHandler, ILogger logger) { @@ -27,8 +29,20 @@ namespace Volo.Abp.Cli.Licensing _logger = logger; } - public async Task GetApiKeyOrNullAsync() + public async Task GetApiKeyOrNullAsync(bool invalidateCache = false) { + if (invalidateCache) + { + _apiKeyResult = null; + } + + if (_apiKeyResult != null) + { + return _apiKeyResult; + } + + var url = $"{CliUrls.WwwAbpIo}api/license/api-key"; + using (var client = new CliHttpClient()) { var response = await HttpPolicyExtensions @@ -45,17 +59,17 @@ namespace Volo.Abp.Cli.Licensing if (responseMessage.Exception != null) { _logger.LogWarning( - $"{retryCount}. request attempt failed with an error: \"{responseMessage.Exception.Message}\". " + + $"{retryCount}. request attempt failed to {url} with an error: \"{responseMessage.Exception.Message}\". " + $"Waiting {timeSpan.TotalSeconds} secs for the next try..."); } else if (responseMessage.Result != null) { _logger.LogWarning( - $"{retryCount}. request attempt failed with {responseMessage.Result.StatusCode}-{responseMessage.Result.ReasonPhrase}. " + + $"{retryCount}. request attempt failed {url} with {(int)responseMessage.Result.StatusCode}-{responseMessage.Result.ReasonPhrase}. " + $"Waiting {timeSpan.TotalSeconds} secs for the next try..."); } }) - .ExecuteAsync(async () => await client.GetAsync($"{CliUrls.WwwAbpIo}api/license/api-key")); + .ExecuteAsync(async () => await client.GetAsync(url)); if (!response.IsSuccessStatusCode) { @@ -65,7 +79,20 @@ namespace Volo.Abp.Cli.Licensing await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response); var responseContent = await response.Content.ReadAsStringAsync(); - return JsonSerializer.Deserialize(responseContent); + var apiKeyResult = JsonSerializer.Deserialize(responseContent); + + if (apiKeyResult == null || + string.IsNullOrEmpty(apiKeyResult.ApiKey)) + { + _logger.LogError("Couldn't retrieve your NuGet API key!"); + _logger.LogWarning(File.Exists(CliPaths.AccessToken) + ? "Make sure you have an active session and license on commercial.abp.io. To re-sign in you can use the CLI command \"abp login \"." + : "You are not signed in to commercial.abp.io. Use the CLI command \"abp login \" to sign in."); + + return null; + } + + return apiKeyResult; } } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/IApiKeyService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/IApiKeyService.cs index 23ff81555a..8638472e5c 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/IApiKeyService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/IApiKeyService.cs @@ -4,6 +4,6 @@ namespace Volo.Abp.Cli.Licensing { public interface IApiKeyService { - Task GetApiKeyOrNullAsync(); + Task GetApiKeyOrNullAsync(bool invalidateCache = false); } } \ 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 1a067243d5..3cdd658403 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 @@ -2,10 +2,19 @@ using Newtonsoft.Json; using NuGet.Versioning; using System; using System.Collections.Generic; +using System.IO; using System.Linq; +using System.Net; +using System.Net.Http; using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Polly; +using Polly.Extensions.Http; using Volo.Abp.Cli.Http; +using Volo.Abp.Cli.Licensing; using Volo.Abp.Cli.ProjectBuilding; +using Volo.Abp.Cli.ProjectModification; using Volo.Abp.DependencyInjection; using Volo.Abp.Json; using Volo.Abp.Threading; @@ -14,37 +23,54 @@ namespace Volo.Abp.Cli.NuGet { public class NuGetService : ITransientDependency { + public ILogger Logger { get; set; } protected IJsonSerializer JsonSerializer { get; } - protected ICancellationTokenProvider CancellationTokenProvider { get; } - protected IRemoteServiceExceptionHandler RemoteServiceExceptionHandler { get; } + private readonly IApiKeyService _apiKeyService; public NuGetService( IJsonSerializer jsonSerializer, IRemoteServiceExceptionHandler remoteServiceExceptionHandler, - ICancellationTokenProvider cancellationTokenProvider) + ICancellationTokenProvider cancellationTokenProvider, IApiKeyService apiKeyService) { JsonSerializer = jsonSerializer; RemoteServiceExceptionHandler = remoteServiceExceptionHandler; CancellationTokenProvider = cancellationTokenProvider; + _apiKeyService = apiKeyService; + Logger = NullLogger.Instance; } public async Task GetLatestVersionOrNullAsync(string packageId, bool includePreviews = false, bool includeNightly = false) { + var url = includeNightly ? + $"https://www.myget.org/F/abp-nightly/api/v3/flatcontainer/{packageId.ToLowerInvariant()}/index.json" : + $"https://api.nuget.org/v3-flatcontainer/{packageId.ToLowerInvariant()}/index.json"; + + using (var client = new CliHttpClient(setBearerToken: false)) { - var url = includeNightly ? - $"https://www.myget.org/F/abp-nightly/api/v3/flatcontainer/{packageId.ToLowerInvariant()}/index.json" : - $"https://api.nuget.org/v3-flatcontainer/{packageId.ToLowerInvariant()}/index.json"; + var responseMessage = await GetHttpResponseMessageWithRetryAsync(client, url); - var responseMessage = await client.GetAsync(url, CancellationTokenProvider.Token); + if (responseMessage.StatusCode == HttpStatusCode.NotFound) + { + var commercialNuGetUrl = await GetNuGetUrlForCommercialPackage(packageId); + responseMessage = await GetHttpResponseMessageWithRetryAsync(client, commercialNuGetUrl); + } + + if (!responseMessage.IsSuccessStatusCode) + { + throw new Exception($"ERROR: Remote server returns '{responseMessage.StatusCode}'"); + } await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(responseMessage); - var result = await responseMessage.Content.ReadAsStringAsync(); + var responseContent = await responseMessage.Content.ReadAsStringAsync(); - var versions = JsonSerializer.Deserialize(result).Versions.Select(x => SemanticVersion.Parse(x)); + var versions = JsonSerializer + .Deserialize(responseContent) + .Versions + .Select(SemanticVersion.Parse); if (!includePreviews && !includeNightly) { @@ -56,6 +82,42 @@ namespace Volo.Abp.Cli.NuGet } } + private async Task GetNuGetUrlForCommercialPackage(string packageId) + { + var apiKeyResult = await _apiKeyService.GetApiKeyOrNullAsync(); + return CliUrls.GetNuGetPackageInfoUrl(apiKeyResult.ApiKey, packageId); + } + + private async Task GetHttpResponseMessageWithRetryAsync(HttpClient client, string url) + { + return await HttpPolicyExtensions + .HandleTransientHttpError() + .OrResult(msg => !msg.IsSuccessStatusCode) + .WaitAndRetryAsync(new[] + { + TimeSpan.FromSeconds(1), + TimeSpan.FromSeconds(3), + TimeSpan.FromSeconds(7) + }, + (responseMessage, timeSpan, retryCount, context) => + { + if (responseMessage.Exception != null) + { + Logger.LogWarning( + $"{retryCount}. HTTP request attempt failed to {url} with an error: HTTP {(int)responseMessage.Result.StatusCode}-{responseMessage.Exception.Message}. " + + $"Waiting {timeSpan.TotalSeconds} secs for the next try..."); + } + else if (responseMessage.Result != null) + { + Logger.LogWarning( + $"{retryCount}. HTTP request attempt failed to {url} with an error: {(int)responseMessage.Result.StatusCode}-{responseMessage.Result.ReasonPhrase}. " + + $"Waiting {timeSpan.TotalSeconds} secs for the next try..."); + } + }) + .ExecuteAsync(async () => await client.GetAsync(url, CancellationTokenProvider.Token)); + } + + public class NuGetVersionResultDto { [JsonProperty("versions")] diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs index 9f6b80b792..cd644b5c33 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs @@ -1,19 +1,24 @@ -using NuGet.Versioning; +using System; +using NuGet.Versioning; using System.IO; using System.Threading.Tasks; using System.Xml; using Volo.Abp.Cli.NuGet; using Volo.Abp.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; namespace Volo.Abp.Cli.ProjectModification { public class VoloNugetPackagesVersionUpdater : ITransientDependency { private readonly NuGetService _nuGetService; + public ILogger Logger { get; set; } public VoloNugetPackagesVersionUpdater(NuGetService nuGetService) { _nuGetService = nuGetService; + Logger = NullLogger.Instance; } public async Task UpdateSolutionAsync(string solutionPath, bool includePreviews) @@ -40,24 +45,54 @@ namespace Volo.Abp.Cli.ProjectModification private async Task UpdateVoloPackagesAsync(string content, bool includePreviews) { - var doc = new XmlDocument() { PreserveWhitespace = true }; - doc.LoadXml(content); + string packageId = null; - foreach (XmlNode package in doc.SelectNodes("/Project/ItemGroup/PackageReference[starts-with(@Include, 'Volo.')]")) + try { - var versionAttribute = package.Attributes["Version"]; + var doc = new XmlDocument() + { + PreserveWhitespace = true + }; + + doc.LoadXml(content); - var packageId = package.Attributes["Include"].Value; - var packageVersion = SemanticVersion.Parse(versionAttribute.Value); - var latestVersion = await _nuGetService.GetLatestVersionOrNullAsync(packageId, includePreviews); + var packageNodeList = doc.SelectNodes("/Project/ItemGroup/PackageReference[starts-with(@Include, 'Volo.')]"); - if (latestVersion != null && packageVersion < latestVersion) + if (packageNodeList != null) { - versionAttribute.Value = latestVersion.ToString(); + foreach (XmlNode package in packageNodeList) + { + if (package.Attributes == null) + { + continue; + } + + var versionAttribute = package.Attributes["Version"]; + + packageId = package.Attributes["Include"].Value; + var packageVersion = SemanticVersion.Parse(versionAttribute.Value); + + Logger.LogDebug("Checking package \"{0}\"...", packageId); + + var latestVersion = await _nuGetService.GetLatestVersionOrNullAsync(packageId, includePreviews); + + if (latestVersion != null && packageVersion < latestVersion) + { + Logger.LogInformation("Updating package \"{0}\" v{1} to v{2}", packageId, packageVersion.ToString(), latestVersion.ToString()); + versionAttribute.Value = latestVersion.ToString(); + } + } + + return await Task.FromResult(doc.OuterXml); } } + catch (Exception ex) + { + Logger.LogError("Cannot update volo packages! An error occured while updating the package \"{0}\". Error: {1}", packageId, ex.Message); + Logger.LogException(ex); + } - return doc.OuterXml; + return await Task.FromResult(content); } } } From a8258bdd039fc636eeee828d82694d3f45c785d8 Mon Sep 17 00:00:00 2001 From: Alper Ebicoglu Date: Mon, 30 Dec 2019 09:30:36 +0300 Subject: [PATCH 5/6] Update VoloNugetPackagesVersionUpdater.cs --- .../VoloNugetPackagesVersionUpdater.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs index cd644b5c33..d5756a4566 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs @@ -72,15 +72,19 @@ namespace Volo.Abp.Cli.ProjectModification packageId = package.Attributes["Include"].Value; var packageVersion = SemanticVersion.Parse(versionAttribute.Value); - Logger.LogDebug("Checking package \"{0}\"...", packageId); + Logger.LogDebug("Checking package: \"{0}\" - Current version: {1}", packageId, packageVersion); var latestVersion = await _nuGetService.GetLatestVersionOrNullAsync(packageId, includePreviews); if (latestVersion != null && packageVersion < latestVersion) { - Logger.LogInformation("Updating package \"{0}\" v{1} to v{2}", packageId, packageVersion.ToString(), latestVersion.ToString()); + Logger.LogInformation("Updating package \"{0}\" from v{1} to v{2}.", packageId, packageVersion.ToString(), latestVersion.ToString()); versionAttribute.Value = latestVersion.ToString(); } + else + { + Logger.LogDebug("Package: \"{0}-v{1}\" is up to date.", packageId, packageVersion); + } } return await Task.FromResult(doc.OuterXml); From 9d65b6d8482696f1f2957891c5bc11802362dc3c Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Mon, 30 Dec 2019 10:49:44 +0300 Subject: [PATCH 6/6] Rename AbpDddResource to AbpDddApplicationContractsResource resolves https://github.com/abpframework/abp/issues/2490 --- .../Application/AbpDddApplicationContractsModule.cs | 2 +- .../Abp/Application/Dtos/LimitedResultRequestDto.cs | 2 +- .../AbpDdd/AbpDddApplicationContractsResource.cs | 10 ++++++++++ .../Localization/Resources/AbpDdd/AbpDddResource.cs | 10 ---------- 4 files changed, 12 insertions(+), 12 deletions(-) create mode 100644 framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Localization/Resources/AbpDdd/AbpDddApplicationContractsResource.cs delete mode 100644 framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Localization/Resources/AbpDdd/AbpDddResource.cs diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/AbpDddApplicationContractsModule.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/AbpDddApplicationContractsModule.cs index 3166152e89..a8c0eb84b4 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/AbpDddApplicationContractsModule.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/AbpDddApplicationContractsModule.cs @@ -22,7 +22,7 @@ namespace Volo.Abp.Application Configure(options => { options.Resources - .Add("en") + .Add("en") .AddVirtualJson("/Volo/Abp/Application/Localization/Resources/AbpDdd"); }); } diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/LimitedResultRequestDto.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/LimitedResultRequestDto.cs index e9476a56bc..95c55174ad 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/LimitedResultRequestDto.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/LimitedResultRequestDto.cs @@ -35,7 +35,7 @@ namespace Volo.Abp.Application.Dtos { if (MaxResultCount > MaxMaxResultCount) { - var localizer = validationContext.GetRequiredService>(); + var localizer = validationContext.GetRequiredService>(); yield return new ValidationResult( localizer[ diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Localization/Resources/AbpDdd/AbpDddApplicationContractsResource.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Localization/Resources/AbpDdd/AbpDddApplicationContractsResource.cs new file mode 100644 index 0000000000..ceef26f7c7 --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Localization/Resources/AbpDdd/AbpDddApplicationContractsResource.cs @@ -0,0 +1,10 @@ +using Volo.Abp.Localization; + +namespace Volo.Abp.Application.Localization.Resources.AbpDdd +{ + [LocalizationResourceName("AbpDddApplicationContracts")] + public class AbpDddApplicationContractsResource + { + + } +} diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Localization/Resources/AbpDdd/AbpDddResource.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Localization/Resources/AbpDdd/AbpDddResource.cs deleted file mode 100644 index 75880401d3..0000000000 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Localization/Resources/AbpDdd/AbpDddResource.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Volo.Abp.Localization; - -namespace Volo.Abp.Application.Localization.Resources.AbpDdd -{ - [LocalizationResourceName("AbpDdd")] - public class AbpDddResource - { - - } -}