Browse Source

Merge pull request #2 from abpframework/dev

merge
pull/2019/head
Marcelo M. M 7 years ago
committed by GitHub
parent
commit
f376cb899d
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      README.md
  2. 13
      abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/pt-BR.json
  3. 60
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/pt-BR.json
  4. 31
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/pt-BR.json
  5. 5
      abp_io/AbpIoLocalization/AbpIoLocalization/Blog/Localization/Resources/pt-BR.json
  6. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
  7. 30
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json
  8. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json
  9. 5
      abp_io/AbpIoLocalization/AbpIoLocalization/Docs/Localization/Resources/pt-BR.json
  10. 5
      abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/pt-BR.json
  11. 160
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/pt-BR.json
  12. 2
      common.props
  13. 10
      common.test.props
  14. 35
      docs/cs/Best-Practices/PostgreSQL-Integration.md
  15. BIN
      docs/cs/Best-Practices/images/postgresql-delete-initial-migrations.png
  16. BIN
      docs/cs/Best-Practices/images/postgresql-update-database.png
  17. 61
      docs/cs/Dapper.md
  18. 126
      docs/cs/Getting-Started-Angular-Template.md
  19. 14
      docs/cs/docs-nav.json
  20. 5
      docs/docs-langs.json
  21. 21
      docs/en/Blog-Posts/2019-09-25 v0_21_Release/Post.md
  22. BIN
      docs/en/Blog-Posts/2019-09-25 v0_21_Release/volosoft-booth.png
  23. 4
      docs/en/Getting-Started-Angular-Template.md
  24. 4
      docs/en/Modules/Index.md
  25. 31
      docs/es/Index.md
  26. 8
      docs/pt-BR/Getting-Started-Angular-Template.md
  27. 16
      docs/pt-BR/Getting-Started-AspNetCore-Application.md
  28. 6
      docs/pt-BR/Getting-Started-AspNetCore-MVC-Template.md
  29. 9
      docs/pt-BR/Getting-Started-Console-Application.md
  30. 21
      docs/zh-Hans/Blog-Posts/2019-09-25 v0_21_Release/Post.md
  31. BIN
      docs/zh-Hans/Blog-Posts/2019-09-25 v0_21_Release/volosoft-booth.png
  32. 4
      framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj
  33. 27
      framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Properties/launchSettings.json
  34. 12
      framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.csproj
  35. 27
      framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo/Abp/AspNetCore/Authentication/OAuth/Claims/MultipleClaimAction.cs
  36. 27
      framework/src/Volo.Abp.AspNetCore.MultiTenancy/Properties/launchSettings.json
  37. 6
      framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo.Abp.AspNetCore.MultiTenancy.csproj
  38. 27
      framework/src/Volo.Abp.AspNetCore.Mvc.Client/Properties/launchSettings.json
  39. 6
      framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.csproj
  40. 7
      framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/CachedApplicationConfigurationClient.cs
  41. 116
      framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/RemoteTenantStore.cs
  42. 2
      framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo.Abp.AspNetCore.Mvc.Contracts.csproj
  43. 14
      framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/FindTenantResultDto.cs
  44. 13
      framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/IAbpTenantAppService.cs
  45. 6
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs
  46. 6
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.csproj
  47. 27
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Properties/launchSettings.json
  48. 6
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo.Abp.AspNetCore.Mvc.UI.Bundling.csproj
  49. 11
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs
  50. 4
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Styles/StyleBundler.cs
  51. 6
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs
  52. 3
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs
  53. 3
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperStyleService.cs
  54. 52
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/AbpTenantAppService.cs
  55. 37
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/AbpTenantController.cs
  56. 11
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/FindTenantResult.cs
  57. 4
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.csproj
  58. 12
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/es-mx.json
  59. 27
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Properties/launchSettings.json
  60. 6
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo.Abp.AspNetCore.Mvc.UI.Packages.csproj
  61. 2
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Components/Toolbar/UserMenu/Default.cshtml
  62. 4
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj
  63. 8
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.csproj
  64. 27
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Properties/launchSettings.json
  65. 6
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo.Abp.AspNetCore.Mvc.UI.Widgets.csproj
  66. 6
      framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo.Abp.AspNetCore.Mvc.UI.csproj
  67. 16
      framework/src/Volo.Abp.AspNetCore.Mvc/Microsoft/AspNetCore/Builder/AbpAspNetCoreMvcApplicationBuilderExtensions.cs
  68. 27
      framework/src/Volo.Abp.AspNetCore.Mvc/Properties/launchSettings.json
  69. 10
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj
  70. 19
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs
  71. 2
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/AbpServiceConvention.cs
  72. 39
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DependencyInjection/AbpAspNetCoreMvcConventionalDependencyRegistrar.cs
  73. 27
      framework/src/Volo.Abp.AspNetCore.TestBase/Properties/launchSettings.json
  74. 8
      framework/src/Volo.Abp.AspNetCore.TestBase/Volo.Abp.AspNetCore.TestBase.csproj
  75. 9
      framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/DynamicProxying/AspNetCoreTestDynamicProxyHttpClientFactory.cs
  76. 57
      framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs
  77. 2
      framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Hosting/AbpHostingEnvironmentExtensions.cs
  78. 35
      framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationMiddleware.cs
  79. 80
      framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs
  80. 12
      framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/IAbpRequestLocalizationOptionsProvider.cs
  81. 4
      framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/AbpAspNetCoreServiceCollectionExtensions.cs
  82. 27
      framework/src/Volo.Abp.AspNetCore/Properties/launchSettings.json
  83. 15
      framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj
  84. 4
      framework/src/Volo.Abp.AspNetCore/Volo/Abp/ApplicationInitializationContextExtensions.cs
  85. 6
      framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/VirtualFileSystem/WebContentFileProvider.cs
  86. 2
      framework/src/Volo.Abp.Authorization/Volo.Abp.Authorization.csproj
  87. 2
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs
  88. 2
      framework/src/Volo.Abp.Autofac/Volo.Abp.Autofac.csproj
  89. 4
      framework/src/Volo.Abp.Caching/Volo.Abp.Caching.csproj
  90. 6
      framework/src/Volo.Abp.Caching/Volo/Abp/Caching/CacheOptions.cs
  91. 2
      framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs
  92. 18
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs
  93. 51
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs
  94. 1
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClient.cs
  95. 4
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/AbpIoApiKeyService.cs
  96. 2
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/IApiKeyService.cs
  97. 7
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ProjectBuildPipelineBuilder.cs
  98. 23
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/LicenseCodeReplaceStep.cs
  99. 14
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/NugetReferenceReplaceStep.cs
  100. 1
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenameStep.cs

4
README.md

@ -5,7 +5,7 @@
[![NuGet Download](https://img.shields.io/nuget/dt/Volo.Abp.Core.svg?style=flat-square)](https://www.nuget.org/packages/Volo.Abp.Core)
[![MyGet (with prereleases)](https://img.shields.io/myget/abp-nightly/vpre/Volo.Abp.Core.svg?style=flat-square)](https://docs.abp.io/en/abp/latest/Nightly-Builds)
This project is the next generation of the [ASP.NET Boilerplate](https://aspnetboilerplate.com/) web application framework. See [the announcement](https://abp.io/blog/abp/Abp-vNext-Announcement).
This project is the next generation of the [ASP.NET Boilerplate](https://aspnetboilerplate.com/) web application framework. See [the announcement](https://blog.abp.io/abp/Abp-vNext-Announcement).
See the official [web site (abp.io)](https://abp.io/) for more information.
@ -21,7 +21,7 @@ See the <a href="https://docs.abp.io/" target="_blank">documentation</a>.
#### Pre Requirements
- Visual Studio 2019 16.1.0+
- Visual Studio 2019 16.3.0+
#### Framework

13
abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/pt-BR.json

@ -0,0 +1,13 @@
{
"culture": "pt-BR",
"texts": {
"Account": "Conta",
"Welcome": "Bem-vindo",
"UseOneOfTheFollowingLinksToContinue": "Use um dos seguintes links para continuar",
"FrameworkHomePage": "Página inicial do Framework",
"FrameworkDocumentation": " Documentação do Framework",
"OfficialBlog": "Blog oficial",
"CommercialHomePage": "Página inicial comercial",
"CommercialSupportWebSite": "Site de suporte comercial"
}
}

60
abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/pt-BR.json

@ -0,0 +1,60 @@
{
"culture": "pt-BR",
"texts": {
"Permission:NpmPackages": "Pacotes NPM",
"Permission:NugetPackages": "Pacotes Nuget",
"Permission:Maintenance": "Manutenção",
"Permission:Maintain": "Manter",
"Permission:ClearCaches": "Limpar caches",
"Permission:Modules": "Módulos",
"Permission:Packages": "Pacotes",
"Permission:Edit": "Editar",
"Permission:Delete": "Excluir",
"Permission:Create": "Criar",
"Menu:Packages": "Pacotes",
"NpmPackageDeletionWarningMessage": "Este pacote NPM será excluído. Você confirma isso?",
"NugetPackageDeletionWarningMessage": "Este pacote Nuget será excluído. Você confirma isso?",
"ModuleDeletionWarningMessage": "Este módulo será excluído. Você confirma isso?",
"Name": "Nome",
"DisplayName": "Mostrar nome",
"ShortDescription": "Breve descrição",
"NameFilter": "Nome",
"CreationTime": "Hora da criação",
"IsPro": "É profissional",
"EfCoreConfigureMethodName": "Configurar nome do método",
"IsProFilter": "É profissional",
"ApplicationType": "Tipo de aplicativo",
"Target": "Objetivo",
"TargetFilter": "Objetivo",
"ModuleClass": "Classe do módulo",
"NugetPackageTarget.DomainShared": "Domínio compartilhado",
"NugetPackageTarget.Domain": "Domínio",
"NugetPackageTarget.Application": "Aplicativo",
"NugetPackageTarget.ApplicationContracts": "Contratos de aplicativos",
"NugetPackageTarget.HttpApi": "Http Api",
"NugetPackageTarget.HttpApiClient": "Cliente HTTP da API",
"NugetPackageTarget.Web": "Web",
"NugetPackageTarget.EntityFrameworkCore": "EntityFramework Core",
"NugetPackageTarget.MongoDB": "MongoDB",
"Edit": "Editar",
"Delete": "Excluir",
"Refresh": "Atualizar",
"NpmPackages": "Pacotes NPM",
"NugetPackages": "Pacotes Nuget",
"NpmPackageCount": "Contagem de pacotes NPM",
"NugetPackageCount": "Contagem de pacotes Nuget",
"Module": "Módulos",
"ModuleInfo": "Informações do módulo",
"CreateANpmPackage": "Criar um pacote NPM",
"CreateAModule": "Criar um módulo",
"CreateANugetPackage": "Criar um pacote Nuget",
"AddNew": "Adicionar novo",
"PackageAlreadyExist{0}": "\"{0}\" o pacote já foi adicionado.",
"ClearCache": "Limpar cache",
"SuccessfullyCleared": "Limpo com sucesso",
"Menu:NpmPackages": "Pacotes NPM",
"Menu:Modules": "Módulos",
"Menu:Maintenance": "Manutenção",
"Menu:NugetPackages": "Pacotes Nuget"
}
}

31
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/pt-BR.json

@ -0,0 +1,31 @@
{
"culture": "pt-BR",
"texts": {
"Volo.AbpIo.Domain:010004": "Número máximo de membros atingido!",
"Volo.AbpIo.Domain:010005": "Número máximo de proprietários atingido!",
"Volo.AbpIo.Domain:010006": "Este usuário já é proprietário desta organização!",
"Volo.AbpIo.Domain:010007": "Este usuário já é desenvolvedor desta organização!",
"Volo.AbpIo.Domain:010008": "A contagem permitida de desenvolvedores não pode ser inferior à contagem atual de desenvolvedores!",
"Volo.AbpIo.Domain:010009": "A contagem permitida de desenvolvedores não pode ser inferior a 0!",
"Volo.AbpIo.Domain:010010": "A contagem máxima de endereços mac foi excedida!",
"Volo.AbpIo.Domain:010011": "A licença pessoal não pode ter mais de um desenvolvedor!",
"Volo.AbpIo.Domain:010012": "A licença não pode ser estendida um mês após a expiração da licença!",
"Volo.AbpIo.Domain:020001": "Não foi possível excluir este pacote NPM porque \"{NugetPackages}\" Os pacotes Nuget dependem deste pacote.",
"Volo.AbpIo.Domain:020002": "Não foi possível excluir este pacote NPM porque \"{Modules}\" Módulos estão usando este pacote.",
"Volo.AbpIo.Domain:020003": "Não foi possível excluir este pacote NPM porque \"{Modules}\" Módulos estão usando este pacote e \"{NugetPackages}\" Os pacotes Nuget dependem deste pacote.",
"Volo.AbpIo.Domain:020004": "Não foi possível excluir este pacote Nuget porque \"{Modules}\" Módulos estão usando este pacote.",
"WantToLearn?": "Quer aprender?",
"ReadyToGetStarted?": "Pronto para começar?",
"JoinOurCommunity": "Participe da nossa comunidade",
"GetStartedUpper": "INICIAR",
"ForkMeOnGitHub": "Bifurque-me no GitHub",
"Features": "Recursos",
"GetStarted": "Introdução",
"Documents": "Documentos",
"Community": "Comunidade",
"ContributionGuide": "Guia de contribuição",
"Blog": "Blog",
"Commercial": "Comercial",
"SeeDocuments": "Ver documentos"
}
}

5
abp_io/AbpIoLocalization/AbpIoLocalization/Blog/Localization/Resources/pt-BR.json

@ -0,0 +1,5 @@
{
"culture": "pt-BR",
"texts": {
}
}

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json

@ -24,6 +24,7 @@
"LicenseAddDeveloperMessage": "{0} developers added to your license" ,
"Volo.AbpIo.Commercial:010004": "Can not find the specified user! The user must have already registered.",
"MyOrganizations": "My organizations",
"ApiKey": "API key"
"ApiKey": "API key",
"UserNameNotFound": "There is no user with username {0}"
}
}

30
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json

@ -0,0 +1,30 @@
{
"culture": "pt-BR",
"texts": {
"OrganizationManagement": "Gerenciamento da organização",
"OrganizationList": "Lista de organização",
"Volo.AbpIo.Commercial:010003": "Você não é proprietário desta organização!",
"OrganizationNotFoundMessage": "Nenhuma organização encontrada!",
"DeveloperCount": "Número de desenvolvedores",
"Owners": "Proprietários",
"AddMember": "Adicionar membro",
"AddOwner": "Adicionar proprietário",
"AddDeveloper": "Adicionar desenvolvedor",
"UserName": "Nome de usuário",
"Name": "Nome",
"EmailAddress": "Endereço de email",
"Developers": "Desenvolvedores",
"LicenseType": "Tipo de licença",
"Manage": "Gerenciar",
"StartDate": "Data de início",
"EndDate": "Data final",
"Modules": "Módulos",
"LicenseExtendMessage": "A data de término da sua licença foi estendida para {0}",
"LicenseUpgradeMessage": "Sua licença foi atualizada para {0}",
"LicenseAddDeveloperMessage": "{0} desenvolvedores adicionados à sua licença",
"Volo.AbpIo.Commercial:010004": "Não foi possível encontrar o usuário especificado! O usuário já deve ter se registrado.",
"MyOrganizations": "Minhas organizações",
"ApiKey": "Chave da API",
"UserNameNotFound": "Não há usuário com nome de usuário {0}"
}
}

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json

@ -24,6 +24,7 @@
"LicenseUpgradeMessage": "Lisansınız {0} lisansa yükseltildi",
"LicenseAddDeveloperMessage": "Lisansınıza {0} geliştirici eklendi",
"MyOrganizations": "Organizasyonlarım",
"ApiKey": "API anahtarı"
"ApiKey": "API anahtarı",
"UserNameNotFound": "{0} kullanıcı adı ile bir kullanıcı yok"
}
}

5
abp_io/AbpIoLocalization/AbpIoLocalization/Docs/Localization/Resources/pt-BR.json

@ -0,0 +1,5 @@
{
"culture": "pt-BR",
"texts": {
}
}

5
abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/pt-BR.json

@ -0,0 +1,5 @@
{
"culture": "pt-BR",
"texts": {
}
}

160
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/pt-BR.json

@ -0,0 +1,160 @@
{
"culture": "pt-BR",
"texts": {
"GetStarted": "Introdução",
"Create": "Criar",
"NewProject": "Novo projeto",
"DirectDownload": "Download direto",
"ProjectName": "Nome do projeto",
"ProjectType": "Tipo de projeto",
"DatabaseProvider": "Provedor de banco de dados",
"NTier": "N-Tier",
"IncludeUserInterface": "Incluir interface do usuário",
"CreateNow": "Criar agora",
"TheStartupProject": "O projeto de inicialização",
"Tutorial": "Tutorial",
"UsingCLI": "Usando CLI",
"SeeDetails": "Ver detalhes",
"AbpShortDescription": "ABP é uma arquitetura completa e uma forte infraestrutura para criar aplicativos da web modernos! Segue as melhores práticas e convenções para fornecer uma sólida experiência de desenvolvimento.",
"SourceCodeUpper": "CÓDIGO FONTE",
"LatestReleaseLogs": "Últimos registros de lançamento",
"Infrastructure": "Infra-estrutura",
"Architecture": "Arquitetura",
"Modular": "Modular",
"DontRepeatYourself": "Não se repita",
"DeveloperFocused": "Desenvolvedor focado",
"FullStackApplicationInfrastructure": "Infraestrutura de aplicativos full stack.",
"DomainDrivenDesign": "Design Orientado a Domínio",
"DomainDrivenDesignExplanation": "Projetado e desenvolvido com base nos padrões e princípios DDD. Fornece um modelo em camadas para seu aplicativo.",
"Authorization": "Autorização",
"AuthorizationExplanation": "Autorização avançada com usuário, função e sistema de permissão refinado. Criada na biblioteca Microsoft Identity.",
"MultiTenancy": "Múltiplos inquilinos",
"MultiTenancyExplanation": "Aplicativos SaaS facilitados! Multilocação integrada do banco de dados à interface do usuário.",
"CrossCuttingConcerns": "Preocupações transversais",
"CrossCuttingConcernsExplanation": "Infraestrutura completa para autorização, validação, tratamento de exceções, armazenamento em cache, log de auditoria, gerenciamento de transações e assim por diante.",
"BuiltInBundlingMinification": "Pacote & Minificação Integrados",
"BuiltInBundlingMinificationExplanation": "Pare de usar ferramentas externas para empacotamento e minificação. O ABP oferece uma maneira mais simples, dinâmica, poderosa, modular e integrada!",
"VirtualFileSystem": "Sistema de arquivos virtual",
"VirtualFileSystemExplanation": "Incorpore visualizações, scripts, estilos, imagens ... aos pacotes/bibliotecas e reutilize-os em diferentes aplicativos.",
"Theming": "Theming",
"ThemingExplanation": "Use e personalize o tema da interface do usuário padrão baseado em bootstrap-based ou crie o seu próprio.",
"BootstrapTagHelpersDynamicForms": "Bootstrap Tag Helpers & Dynamic Forms",
"BootstrapTagHelpersDynamicFormsExplanation": "Sistema de tarefas em segundo plano integrado que pode ser integrado ao Hangfire, RabbitMQ ou a qualquer ferramenta que você desejar.", //TODO explanation doesn't match.
"HTTPAPIsDynamicProxies": "APIs HTTP e proxies dinâmicos",
"HTTPAPIsDynamicProxiesExplanation": "Exponha automaticamente os serviços de aplicativo como APIs HTTP do estilo REST e consuma com proxies JavaScript & C # dinâmicos.",
"CompleteArchitectureInfo": "Arquitetura moderna para criar soluções de software sustentáveis.",
"DomainDrivenDesignBasedLayeringModelExplanation": "Ajuda você a implementar uma arquitetura em camadas baseada em DDD e a construir uma base de código sustentável.",
"DomainDrivenDesignBasedLayeringModelExplanationCont": "Fornece modelos de inicialização, abstrações, classes base, serviços, documentação e guias para ajudá-lo a desenvolver seu aplicativo com base nos padrões e princípios DDD.",
"MicroserviceCompatibleModelExplanation": "O framework principal e os módulos de pré-construção foram projetados para a arquitetura de microsserviço.",
"MicroserviceCompatibleModelExplanationCont": "Fornece infraestrutura, integrações, amostras e documentação para implementar soluções de microsserviço mais facilmente, enquanto isso não traga complexidade adicional se você quiser um aplicativo monolítico.",
"ModularInfo": "O ABP fornece um sistema completo de modularidade para permitir o desenvolvimento de módulos de aplicativos reutilizáveis.",
"PreBuiltModulesThemes": "Módulos pré-construídos & Temas",
"PreBuiltModulesThemesExplanation": "Módulos e temas de código aberto e comerciais estão prontos para uso em seu aplicativo de negócios.",
"NuGetNPMPackages": "Pacotes NuGet & NPM",
"NuGetNPMPackagesExplanation": "Distribuído como pacotes NuGet & NPM. Fácil de instalar e atualizar.",
"ExtensibleReplaceable": "Extensível/Substituível",
"ExtensibleReplaceableExplanation": "Todos os serviços e módulos são projetados para extensibilidade. Você pode substituir serviços, páginas, estilos, componentes...",
"CrossCuttingConcernsExplanation2": "Mantenha seu código mais limpo e concentre-se em seu próprio código comercial.",
"CrossCuttingConcernsExplanation3": "Não perca tempo para implementar requisitos de aplicativos comuns repetidamente.",
"AuthenticationAuthorization": "Autenticação & Autorização",
"ExceptionHandling": "Manipulação de exceção",
"Validation": "Validação",
"DatabaseConnection": "Conexão com o Banco de Dados",
"TransactionManagement": "Gerenciamento de transações",
"AuditLogging": "Log de auditoria",
"Caching": "Armazenamento em cache",
"Multitenancy": "Múltiplos inquilinos",
"DataFiltering": "Filtragem de dados",
"ConventionOverConfiguration": "Convenção sobre configuração",
"ConventionOverConfigurationExplanation": "O ABP implementa convenções comuns de aplicativos por padrão com uma configuração mínima ou zero.",
"ConventionOverConfigurationExplanationList1": "Registra automaticamente serviços conhecidos na injeção de dependência.",
"ConventionOverConfigurationExplanationList2": "Expõe os serviços de aplicativos como APIs HTTP, nomeando convenções.",
"ConventionOverConfigurationExplanationList3": "Cria proxies de clientes HTTP dinâmicos para C # e JavaScript.",
"ConventionOverConfigurationExplanationList4": "Fornece repositórios padrão para suas entidades.",
"ConventionOverConfigurationExplanationList5": "Gerencia a unidade de trabalho por solicitação da Web ou método de serviço de aplicativo.",
"ConventionOverConfigurationExplanationList6": "Publica, cria, atualiza e exclui eventos para suas entidades.",
"BaseClasses": "Classes base",
"BaseClassesExplanation": "Classes base pré-criadas para padrões de aplicativos comuns.",
"DeveloperFocusedExplanation": "O ABP é para desenvolvedores.",
"DeveloperFocusedExplanationCont": "Tem como objetivo simplificar o desenvolvimento diário de seu software, sem restringir o trabalho de baixo nível quando necessário.",
"SeeAllFeatures": "Veja todos os recursos",
"CLI_CommandLineInterface": "CLI (Command Line Interface)",
"CLI_CommandLineInterfaceExplanation": "A CLI é automatizada para criar novos projetos e adicionar módulos ao seu aplicativo.",
"StartupTemplates": "Modelos de inicialização",
"StartupTemplatesExplanation": "Vários modelos de inicialização fornecem uma solução totalmente configurada para iniciar rapidamente seu desenvolvimento.",
"BasedOnFamiliarTools": "Baseado em ferramentas familiares",
"BasedOnFamiliarToolsExplanation": "Construído e integrado a ferramentas populares que você já conhece. Baixa curva de aprendizado, fácil adaptação, desenvolvimento confortável.",
"ORMIndependent": "ORM Independente",
"ORMIndependentExplanation": "O framework principal é independente do ORM/banco de dados e pode funcionar com qualquer fonte de dados. Os provedores Entity Framework Core e MongoDB já estão disponíveis.",
"Features": "Recursos",
"ABPCLI": "ABP CLI",
"Modularity": "Modularidade",
"BootstrapTagHelpers": "Bootstrap Tag Helpers",
"DynamicForms": "Formulários dinâmicos",
"BundlingMinification": "Empacotamento e Minificação",
"BackgroundJobs": "Trabalhos em segundo plano",
"DDDInfrastructure": "Infraestrutura DDD",
"DomainDrivenDesignInfrastructure": "Infraestrutura de Design Orientada a Domínio",
"AutoRESTAPIs": "APIs REST automáticas",
"DynamicClientProxies": "Proxies de cliente dinâmicos",
"DistributedEventBus": "Barramento de Eventos Distribuídos",
"DistributedEventBusWithRabbitMQIntegration": "Barramento de Eventos Distribuídos com Integração RabbitMQ",
"TestInfrastructure": "Infraestrutura de Teste",
"AuditLogging": "Log de auditoria",
"AuditLoggingEntityHistories": "Log de auditoria e históricos de entidades",
"ObjectToObjectMapping": "Objeto para Mapeamento de Objetos",
"EmailSMSAbstractions": "Abstrações de E-mail e SMS",
"EmailSMSAbstractionsWithTemplatingSupport": "Abstrações de e-mail e SMS com suporte a modelos",
"Localization": "Localização",
"SettingManagement": "Gerenciamento de configurações",
"ExtensionMethods": "Métodos de extensão",
"ExtensionMethodsHelpers": "Métodos de extensão & Helpers",
"AspectOrientedProgramming": "Programação Orientada a Aspectos",
"DependencyInjection": "Injeção de dependência",
"DependencyInjectionByConventions": "Injeção de dependência por convenções",
"ABPCLIExplanation": "O ABP CLI (Command Line Interface) é uma ferramenta de linha de comando para executar algumas operações comuns em soluções baseadas em ABP.",
"ModularityExplanation": "O ABP fornece uma infraestrutura completa para criar seus próprios módulos de aplicativos, que podem ter entidades, serviços, integração de banco de dados, APIs, componentes de interface do usuário e assim por diante ...", //TODO: strong "your own application modules",-
"MultiTenancyExplanation": "ABP framework não apenas suporta o desenvolvimento de aplicativos com vários inquilinos, mas também faz com que seu código desconheça a multilocação.",
"MultiTenancyExplanation2": "Pode determinar automaticamente o inquilino atual, isolar os dados de inquilinos diferentes um do outro.",
"MultiTenancyExplanation3": "Suporta abordagens de banco de dados único, banco de dados por inquilino e híbrido.",
"MultiTenancyExplanation4": "Você se concentra no seu código comercial e deixa o framework lidar com a multilocação em seu nome.",
"BootstrapTagHelpersExplanation": "Em vez de escrever manualmente os detalhes repetidos dos componentes do bootstrap, use os tag helpers da ABP para simplificá-lo e tirar proveito do intellisense. Você pode definitivamente usar o Bootstrap sempre que precisar.",
"DynamicFormsExplanation": "Formulário dinâmico e entrada de tag helpers pode criar o formulário completo a partir de uma classe C# como modelo.",
"AuthenticationAuthorizationExplanation": "Opções avançadas de autenticação e autorização integradas ao ASP.NET Core Identity & IdentityServer4. Fornece um sistema de permissões extensível e detalhado.",
"CrossCuttingConcernsExplanation": "Não se repita para implementar todas essas coisas comuns repetidamente. Concentre-se no seu código comercial e permita que a ABP os automatize por convenções.",
"DatabaseConnectionTransactionManagement": "Gerenciamento de conexão e transação de banco de dados",
"CorrelationIdTracking": "Rastreamento de ID de correlação",
"BundlingMinificationExplanation": "A ABP oferece um sistema de empacotamento e minificação simples, dinâmico, poderoso, modular e embutido.",
"VirtualFileSystemnExplanation": "O Sistema de Arquivos Virtual possibilita gerenciar arquivos que não existem fisicamente no sistema de arquivos (disco). É usado principalmente para incorporar arquivos (js, css, image, cshtml ...) em assemblies e usar como arquivos físicos em tempo de execução.",
"ThemingExplanation": "O sistema Theming permite o desenvolvimento independente do tema do aplicativo e dos módulos, definindo um conjunto de bibliotecas e layouts básicos comuns, com base na estrutura mais recente do Bootstrap.",
"DomainDrivenDesignInfrastructureExplanation": "Uma infraestrutura completa para criar aplicativos em camadas com base nos padrões e princípios de Design Orientado a Domínio;",
"Specification": "Especificação",
"Repository": "Repositório",
"DomainService": "Serviço de Domínio",
"ValueObject": "Value Object",
"ApplicationService": "Serviço de Aplicativo",
"DataTransferObject": "Objeto de transferência de dados",
"AggregateRootEntity": "Raiz agregada, entidade",
"AutoRESTAPIsExplanation": "O ABP pode configurar automaticamente seus serviços de aplicativo como controladores de API por convenção.",
"DynamicClientProxiesExplanation": "Consumir facilmente suas APIs de JavaScript e C # clientes.",
"DistributedEventBusWithRabbitMQIntegrationExplanation": "Publique e consuma facilmente eventos distribuídos usando o Barramento de Eventos Distribuídos interno com a integração RabbitMQ disponível.",
"TestInfrastructureExplanation": "A estrutura foi desenvolvida para testes de unidade e integração. Fornece classes básicas para facilitar. Os modelos de inicialização são pré-configurados para teste.",
"AuditLoggingEntityHistoriesExplanation": "Registro de auditoria interno para aplicativos críticos para os negócios. Solicitação, serviço, log de auditoria no nível do método e histórico de entidades com detalhes no nível da propriedade.",
"EmailSMSAbstractionsWithTemplatingSupportExplanation": "As abstrações IEmailSender e ISmsSender dissociam sua lógica de aplicativo da infraestrutura. O sistema avançado de modelo de email permite criar e localizar modelos de email e usá-lo facilmente sempre que necessário.",
"LocalizationExplanation": "O sistema de localização permite criar recursos em arquivos JSON simples e usá-los para localizar sua interface do usuário. Ele suporta cenários avançados como herança, extensões e integração de JavaScript, enquanto é totalmente compatível com o sistema de localização do AspNet Core.",
"SettingManagementExplanation": "Defina as configurações do seu aplicativo e obtenha valores no tempo de execução com base na configuração atual, inquilino e usuário.",
"ExtensionMethodsHelpersExplanation": "Não se repita, mesmo em partes triviais do código. Extensões e helpers para tipos padrão tornam seu código muito mais limpo e fácil de escrever.",
"AspectOrientedProgrammingExplanation": "Fornece uma infraestrutura confortável para criar proxies dinâmicos e implementar a Programação Orientada a Aspectos. Intercepte qualquer classe e execute seu código antes e depois de cada execução de método.",
"DependencyInjectionByConventionsExplanation": "Não há necessidade de registrar suas classes na injeção de dependência manualmente. Registra automaticamente tipos de serviço comuns por convenção. Para outros tipos de serviços, você pode usar interfaces e atributos para facilitar e colocar no local.",
"DataFilteringExplanation": "Defina e use filtros de dados que serão aplicados automaticamente quando você consultar entidades do banco de dados. Os filtros Soft Delete e MultiTenant são fornecidos imediatamente quando você implementa interfaces simples.",
"PublishEvents": "Publicar eventos",
"HandleEvents": "Manipular Eventos",
"AndMore": "e mais...",
"Code": "Código",
"Result": "Resultado",
"SeeTheDocumentForMoreInformation": "Consulte o <a href=\"{1}\">{0} documento</a> para obter mais informações",
"IndexPageHeroSection": "<span class=\"first-line shine\"><strong>código aberto</strong></span><span class=\"second-line text-uppercase\">Aplicativo da Web<br />Framework </span><span class=\"third-line shine2\"><strong>para o ASP.NET Core</strong></span>",
"UiFramework": "UI Framework",
"EmailAddress": "Endereço de email"
}
}

2
common.props

@ -1,7 +1,7 @@
<Project>
<PropertyGroup>
<LangVersion>latest</LangVersion>
<Version>0.19.0</Version>
<Version>0.21.0</Version>
<NoWarn>$(NoWarn);CS1591</NoWarn>
<PackageIconUrl>https://abp.io/assets/abp_nupkg.png</PackageIconUrl>
<PackageProjectUrl>https://abp.io</PackageProjectUrl>

10
common.test.props

@ -0,0 +1,10 @@
<Project>
<PropertyGroup>
<LangVersion>latest</LangVersion>
<NoWarn>$(NoWarn);CS1591</NoWarn>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
</PropertyGroup>
</Project>

35
docs/cs/Best-Practices/PostgreSQL-Integration.md

@ -0,0 +1,35 @@
## Entity Framework Core PostgreSQL integrace
> Podívejte se na [Entity Framework Core integrační dokument](../Entity-Framework-Core.md) pro základy integrace EF Core.
### Aktualizace projektu EntityFrameworkCore
- V projektu `Acme.BookStore.EntityFrameworkCore` nahraďte balík `Volo.Abp.EntityFrameworkCore.SqlServer` za `Volo.Abp.EntityFrameworkCore.PostgreSql`
- Aktualizace pro použití PostgreSQL v `BookStoreEntityFrameworkCoreModule`
- Nahraďte `AbpEntityFrameworkCoreSqlServerModule` za `AbpEntityFrameworkCorePostgreSqlModule`
- Nahraďte `options.UseSqlServer()` za `options.UsePostgreSql()`
- V jiných projektech aktualizujte PostgreSQL connection string v nezbytných `appsettings.json` souborech
#### Odstranění stávajících migrací
Smažte všechny stavající migrační soubory (včetně `DbContextModelSnapshot`)
![postgresql-delete-initial-migrations](images/postgresql-delete-initial-migrations.png)
#### Znovu vygenerujte počáteční migraci & aktualizujte databázi
Nastavte správný spouštěcí projekt (obvykle web projekt),
Otevřete **Package Manager Console** (Tools -> Nuget Package Manager -> Package Manager Console), zvolte `Acme.BookStore.EntityFrameworkCore.DbMigrations` jako **Default project** a proveďte následující příkaz:
Proveďte příkaz `Add-Migration`:
````
PM> Add-Migration Initial
````
Poté proveďte příkaz `Update-Database` k aktualizaci schématu databáze:
````
PM> Update-Database
````
![postgresql-update-database](images/postgresql-update-database.png)

BIN
docs/cs/Best-Practices/images/postgresql-delete-initial-migrations.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
docs/cs/Best-Practices/images/postgresql-update-database.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

61
docs/cs/Dapper.md

@ -0,0 +1,61 @@
# Dapper integrace
Jelikož myšlenka Dapper je taková, že sql příkaz má přednost, tak hlavně poskytuje metody rozšíření pro `IDbConnection` rozhraní.
Abp nezapouzdřuje přílíš mnoho funkcí pro Dapper. Abp Dapper poskytuje základní třídu `DapperRepository<TDbContext>` založenou na Abp EntityFrameworkCore, který poskytuje vlastnosti `IDbConnection` a `IDbTransaction` vyžadované v Dapper.
Tyto dvě vlastnosti fungují dobře s [jednotkou práce](Unit-Of-Work.md).
## Instalace
Nainstalujte a nakonfigurujte EF Core podle [EF Core integrační dokumentace](Entity-Framework-Core.md).
`Volo.Abp.Dapper` je hlavní NuGet balík pro Dapper integraci. Nainstalujte jej proto do vašeho projektu (pro strukturovanou aplikaci do datové/infrastrukturní vrstvy):
```shell
Install-Package Volo.Abp.Dapper
```
Poté přidejte závislost na `AbpDapperModule` modulu (atribut `DependsOn`) do Vašeho [modulu](Module-Development-Basics.md):
````C#
using Volo.Abp.Dapper;
using Volo.Abp.Modularity;
namespace MyCompany.MyProject
{
[DependsOn(typeof(AbpDapperModule))]
public class MyModule : AbpModule
{
//...
}
}
````
## Implementace Dapper repozitáře
Následující kód implementuje repozitář `Person`, který vyžaduje `DbContext` z EF Core (MyAppDbContext). Můžete vložit `PersonDapperRepository` k volání jeho metod.
`DbConnection` a `DbTransaction` jsou ze základní třídy `DapperRepository`.
```C#
public class PersonDapperRepository : DapperRepository<MyAppDbContext>, ITransientDependency
{
public PersonDapperRepository(IDbContextProvider<MyAppDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
public virtual async Task<List<string>> GetAllPersonNames()
{
return (await DbConnection.QueryAsync<string>("select Name from People", transaction: DbTransaction))
.ToList();
}
public virtual async Task<int> UpdatePersonNames(string name)
{
return await DbConnection.ExecuteAsync("update People set Name = @NewName", new { NewName = name },
DbTransaction);
}
}
```

126
docs/cs/Getting-Started-Angular-Template.md

@ -0,0 +1,126 @@
## Začínáme s Angular aplikační šablonou
Tento tutoriál vysvětluje, jak vytvořit novou Angular aplikaci pomocí spouštěcí šablony, jak ji nakonfigurovat a spustit.
### Tvorba nového projektu
Tento tutorial používá k vytvoření nového projektu **ABP CLI**. Podívejte se na stránku [začínáme](https://abp.io/get-started) pro více možností.
Pokud jste tak dosud neučinili, nainstalujte ABP CLI pomocí okna příkazového řádku:
````bash
dotnet tool install -g Volo.Abp.Cli
````
Použíjte příkaz `abp new` v prázdné složce k vytvoření Vašeho projektu:
````bash
abp new Acme.BookStore -u angular
````
> Můžete použít různé úrovně jmenných prostorů; např. BookStore, Acme.BookStore nebo Acme.Retail.BookStore.
`-u angular` volba specifikuje Angular jako UI framework. Výchozí poskytovatel databáze je EF Core. Podívejte se na [CLI dokumentaci](CLI.md) pro všechny dostupné možnosti.
#### Předběžné požadavky
Vytvořené řešení vyžaduje;
* [Visual Studio 2017 (v15.9.0+)](https://visualstudio.microsoft.com/tr/downloads/)
* [.NET Core 2.2+](https://www.microsoft.com/net/download/dotnet-core/)
* [Node v10.16+](https://nodejs.org)
* [Yarn v1.17+](https://yarnpkg.com/)
### Struktura řešení
Otevřete řešení ve **Visual Studio**:
![bookstore-visual-studio-solution](images/bookstore-visual-studio-solution-for-spa.png)
Řešení má vrstvenou strukturu (založenou na [domain driven designu](Domain-Driven-Design.md)) a obsahuje projekty testů jednotek a integrace správně nakonfigurované pro práci s **EF Core** & **SQLite in-memory** databází.
> Podívejte se na [dokument šablony aplikace](Startup-Templates/Application.md) k detailnímu pochopení struktury řešení.
### Databázový connection string
Zkontrolujte **connection string** v souboru `appsettings.json` u projektu `.HttpApi.Host`:
````json
{
"ConnectionStrings": {
"Default": "Server=localhost;Database=BookStore;Trusted_Connection=True"
}
}
````
Řešení je nakonfigurováno pro použití **Entity Framework Core** s **MS SQL Server**. EF Core podporuje [různé](https://docs.microsoft.com/en-us/ef/core/providers/) poskytovatele databáze, takže pokud chcete můžete použít jiný DBMS. V případě potřeby změňte connection string.
### Tvorba databáze & aplikace migrací databáze
K vytvoření databáze máte dvě možnosti.
#### Použití aplikace DbMigrator
Řešení obsahuje konzolovou aplikaci (v tomto příkladu nazvanou `Acme.BookStore.DbMigrator`), která dokáže vytvořit databázi, aplikovat migrace a vložit počáteční data. Ta je užitečná jak pro vývojové tak pro produkční prostředí.
> `.DbMigrator` má vlastní `appsettings.json`. Pokud jste změnili connection string výše, měli byste změnit i tento.
Klikněte pravým na projekt `.DbMigrator` zvolte **Set as StartUp Project**:
![set-as-startup-project](images/set-as-startup-project.png)
Zmáčkněte F5 (nebo Ctrl+F5) ke spuštění aplikace. Výstup by měl být podobný vyobrazení níže:
![set-as-startup-project](images/db-migrator-app.png)
#### Použití příkazu EF Core Update-Database
Ef Core máš příkaz `Update-Database`, který v případě potřeby vytvoří databázi a aplikuje čekající migrace. Klikněte pravým na projekt `.Web` a zvolte **Set as StartUp Project**:
![set-as-startup-project](images/set-as-startup-project.png)
Otevřete **Package Manager Console**, zvolte `.EntityFrameworkCore.DbMigrations` jako **Default Project** a proveďte příkaz `Update-Database`:
![pcm-update-database](images/pcm-update-database-v2.png)
Tímto vytvoříte novou databáze podle nakonfigurovaného connection string.
> Je doporučeno užití nástroje `.DbMigrator`, protože zároveň vloží i počáteční data ke správnému běhu webové aplikace.
### Spuštění aplikace
#### Spuštění API Host (na straně serveru)
Ujistěte se že je projekt `.HttpApi.Host` nastaven jako startovací a spusťte aplikaci což otevře Swagger UI:
![bookstore-homepage](images/bookstore-swagger-ui-host.png)
Tady můžete vidět API aplikace a zároveň je i otestovat. Získejte [více informací](https://swagger.io/tools/swagger-ui/) o Swagger UI.
##### Autorizace pro Swagger UI
Vetšina API aplikace vyžaduje autentizaci & autorizaci. Pokud chcete otestovat autorizované API, manuálně přejděte na stránku `/Account/Login`, vložte `admin` jako uživatelské jméno a `1q2w3E*` jako heslo k příhlášení do aplikace. Poté budete moci provádět autorizované požadavky API.
#### Spuštění Angular aplikace (na straně klienta)
Přejděte do složky `angular`, otevřete terminál příkazového řádku, proveďte příkaz `yarn` (doporučujeme používat správce balíků [yarn](https://yarnpkg.com), npm install bude v mnoha případech také fungovat):
````bash
yarn
````
Jakmile jsou načteny všechny node moduly, proveďte příkaz `yarn start` nebo `npm start`:
````bash
yarn start
````
Otevřete Váš oblíbený prohlížeč a přejděte na adresu `localhost:4200`. Počáteční uživatelské jméno je `admin` a heslo `1q2w3E*`.
Startovací šablona obsahuje moduly **správa identit** a **správa tenantů**. Jakmile se přihlásíte, zprístupní se administrační menu kde můžete spravovat **tenanty**, **role**, **uživatele** a jejich **oprávnění**.
> Doporučujeme [Visual Studio Code](https://code.visualstudio.com/) jako editor pro Angular projekt, ale klidně použijte Váš oblíbený editor.
### Co dále?
* [Tutoriál vývoje aplikace](Tutorials/Angular/Part-I.md)

14
docs/cs/docs-nav.json

@ -202,7 +202,7 @@
"items": [
{
"text": "API",
"items": [
"items": [
{
"text": "Automatické API řadiče",
"path": "AspNetCore/Auto-API-Controllers.md"
@ -245,11 +245,21 @@
"items": [
{
"text": "Entity Framework Core integrace",
"path": "Entity-Framework-Core.md"
"path": "Entity-Framework-Core.md",
"items": [
{
"text": "PostgreSQL integrace",
"path": "Best-Practices/PostgreSQL-Integration.md"
}
]
},
{
"text": "MongoDB integrace",
"path": "MongoDB.md"
},
{
"text": "Dapper integrace",
"path": "Dapper.md"
}
]
},

5
docs/docs-langs.json

@ -4,6 +4,11 @@
"DisplayName" : "English",
"Code" : "en",
"IsDefault": true
},
{
"DisplayName" : "Português",
"Code" : "pt-BR",
"IsDefault": false
},
{
"DisplayName" : "简体中文",

21
docs/en/Blog-Posts/2019-09-25 v0_21_Release/Post.md

@ -0,0 +1,21 @@
# ABP v0.21 Has Been Released based on the ASP.NET Core 3.0
Just one hour after Microsoft released it, ABP v0.21 [has been released](https://twitter.com/abpframework/status/1176185493119258624) based on the ASP.NET Core 3.0.
v0.21 has no new feature. It just upgrades to the stable ASP.NET Core 3.0. Check [v0.20 release notes](https://github.com/abpframework/abp/releases/tag/0.20.0) for new features, enhancements and bug fixes.
## About v1.0
ABP framework is getting closer to v1.0. We intent to release it in the middle of this October. In this time, we will test and document more.
## .NET Conf 2019
Microsoft has lunched ASP.NET Core 3.0 in the .NET Conf 2019, a 3-days virtual conference. ABP's lead developer [Halil ibrahim Kalkan](https://twitter.com/hibrahimkalkan) has also talked in the conference to introduce the ABP framework. It was great to be a part of this important event.
## Techorama Netherlands 2019
[Techorama NL](https://techorama.nl/) is one of the biggest conferences in Europe. This year, Volosoft is a sponsor of the conference and will have a booth to talk to software developers about the ABP framework and software development. Our booth wall will look like shown below:
![volosoft-booth](volosoft-booth.png)
If you are in the conference, come to out booth to talk about the ABP framework. We will also have nice swags for you :)

BIN
docs/en/Blog-Posts/2019-09-25 v0_21_Release/volosoft-booth.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

4
docs/en/Getting-Started-Angular-Template.md

@ -85,13 +85,13 @@ Open the **Package Manager Console**, select `.EntityFrameworkCore.DbMigrations`
This will create a new database based on the configured connection string.
> Using the `.Migrator` tool is the suggested way, because it also seeds the initial data to be able to properly run the web application.
> Using the `.DbMigrator` tool is the suggested way, because it also seeds the initial data to be able to properly run the web application.
### Running the Application
#### Run the API Host (Server Side)
Ensure that the `.HttpApi.Host` project is the startup project and un the application which will open a Swagger UI:
Ensure that the `.HttpApi.Host` project is the startup project and run the application which will open a Swagger UI:
![bookstore-homepage](images/bookstore-swagger-ui-host.png)

4
docs/en/Modules/Index.md

@ -15,7 +15,7 @@ There are some **free and open source** application modules developed and mainta
* **Audit Logging**: Used to persist audit logs to a database.
* **Background Jobs**: Used to persist background jobs when using default background job manager.
* **Blogging**: Used to create fancy blogs. ABP's [own blog](https://abp.io/blog/abp/) already using this module.
* [**Docs**](Docs.md): Used to create technical documentation pages. ABP's [own documentation](https://abp.io/documents/) already using this module.
* [**Docs**](Docs.md): Used to create technical documentation pages. ABP's [own documentation](https://docs.abp.io) already using this module.
* **Identity**: Used to manage roles, users and their permissions.
* **Identity Server**: Integrates to IdentityServer4.
* **Permission Management**: Used to persist permissions.
@ -23,4 +23,4 @@ There are some **free and open source** application modules developed and mainta
* **Tenant Management**: Used to manage tenants for a [multi-tenant](../Multi-Tenancy.md) application.
* **Users**: Used to abstract users, so other modules can depend on this instead of the Identity module.
Documenting the modules is in the progress. See [this repository](https://github.com/abpframework/abp/tree/master/modules) for source code of all modules.
Documenting the modules is in the progress. See [this repository](https://github.com/abpframework/abp/tree/master/modules) for source code of all modules.

31
docs/es/Index.md

@ -0,0 +1,31 @@
# Documentación de ABP
ABP es un **marco de desarrollo de código abierto** enfocado en el desarrollo de aplicaciones web basadas en ASP.NET Core, pero tambien soporta el desarrollo de otro tipo de aplicaciones.
Explora el menú de navegación de la izquierda para profundizar en la documentación.
## Estado del proyecto
ABP es la **próxima generación** del marco de desarrollo de código abierto [ASP.NET Boilerplate](https://aspnetboilerplate.com/). Actualmente se encuentra en una fase preliminar y no está listo para su uso en producción. La documentación todavía está en progreso y se encuentra lejos de estar completa.
Para aplicaciones en fase de producción o que lo vayan a estar en el corto plazo, se sugiere usar el marco de desarrollo [ASP.NET Boilerplate](https://aspnetboilerplate.com/) el cual tiene un completo conjunto de funciones, es maduro, mantenido y actualizado activamente.
## Primeros pasos
La manera más facil para iniciar un proyecto con ABP es usar las plantillas de inicio:
* [Plantilla ASP.NET Core MVC (Razor Pages) UI](Getting-Started-AspNetCore-MVC-Template.md)
* [Plantilla Angular UI](Getting-Started-Angular-Template.md)
Si quieres iniciar desde cero (con un proyecto vacío), entonces instala manualmente el marco de desarrollo ABP y usa los siguientes tutoriales:
* [Aplicación de Consola](Getting-Started-Console-Application.md)
* [Aplicación web con ASP.NET Core](Getting-Started-AspNetCore-Application.md)
## Código fuente
ABP está hospedado en GitHub. Mira el [código fuente](https://github.com/abpframework/abp).
## ¿Quieres contribuir?
ABP es un proyecto de código abierto impulsado por la comunidad. Mira la [guía de contribución](Contribution/Index.md) si quieres formar parte de este proyecto.

8
docs/pt-BR/Getting-Started-Angular-Template.md

@ -1,4 +1,4 @@
## Introdução ao modelo de aplicativo angular
## Introdução ao modelo de aplicativo Angular
Este tutorial explica como criar um novo aplicativo Angular usando o modelo de inicialização, configurar e executá-lo.
@ -37,13 +37,13 @@ Abra a solução no **Visual Studio** :
![livraria-visual-studio-solução](images/bookstore-visual-studio-solution-for-spa.png)
A solução possui uma estrutura em camadas (baseada no [Domain Driven Design](Domain-Driven-Design.md) ) e contém projetos de teste de unidade e integração adequadamente configurados para trabalhar com o **banco de** dados de **memória** **EF Core** e **SQLite** .
A solução possui uma estrutura em camadas (baseada no [Domain Driven Design](Domain-Driven-Design.md) ) e contém projetos de teste de unidade e integração adequadamente configurados para trabalhar com o **banco de dados** **EF Core** & **SQLite in-memory**.
> Consulte o [documento do modelo do aplicativo](Startup-Templates/Application.md) para entender a estrutura da solução em detalhes.
### Cadeia de Conexão de Banco de Dados
### String de Conexão de Banco de Dados
Verifique a **cadeia de conexão** no `appsettings.json`arquivo no `.HttpApi.Host`projeto:
Verifique o **connection string** no `appsettings.json`arquivo no `.HttpApi.Host`projeto:
```json
{

16
docs/pt-BR/Getting-Started-AspNetCore-Application.md

@ -1,10 +1,10 @@
# Introdução ao ABP com o aplicativo Web MVC AspNet Core
# Introdução ao ABP com o AspNet Core MVC Web Application
Este tutorial explica como iniciar o ABP do zero com dependências mínimas. Você geralmente deseja começar com o **modelo de inicialização** .
## Criar um novo projeto
1. Crie um novo aplicativo da Web vazio do AspNet Core no Visual Studio:
1. Crie um novo aplicativo da Web vazio AspNet Core Web Application no Visual Studio:
![img](images/create-new-aspnet-core-application.png)
@ -58,7 +58,7 @@ namespace BasicAspNetCoreApplication
`AppModule` é um bom nome para o módulo de inicialização de um aplicativo.
Os pacotes ABP definem as classes do módulo e um módulo pode depender de outro módulo. No código acima, nosso `AppModule`depende `AbpAspNetCoreMvcModule`(definido pelo pacote Volo.Abp.AspNetCore.Mvc). É comum adicionar um `DependsOn`atributo após a instalação de um novo pacote de nuget ABP.
Os pacotes ABP definem as classes do módulo e um módulo pode depender de outro módulo. No código acima, nosso `AppModule` depende `AbpAspNetCoreMvcModule`(definido pelo pacote Volo.Abp.AspNetCore.Mvc). É comum adicionar um `DependsOn`atributo após a instalação de um novo pacote de nuget ABP.
Em vez da classe Startup, estamos configurando o pipeline do ASP.NET Core nesta classe de módulo.
@ -90,7 +90,7 @@ namespace BasicAspNetCoreApplication
}
```
`ConfigureServices`Método alterado para retornar em `IServiceProvider`vez de `void`. Essa alteração nos permite substituir a injeção de dependência do AspNet Core por outra estrutura (consulte a seção de integração com Autofac abaixo). `services.AddApplication<AppModule>()`adiciona todos os serviços definidos em todos os módulos a partir do `AppModule`.
`ConfigureServices` Método alterado para retornar em `IServiceProvider` vez de `void`. Essa alteração nos permite substituir a injeção de dependência do AspNet Core por outra estrutura (consulte a seção de integração com Autofac abaixo). `services.AddApplication<AppModule>()` adiciona todos os serviços definidos em todos os módulos a partir do `AppModule`.
`app.InitializeApplication()`O `Configure`método call in inicializa e inicia o aplicativo.
@ -118,7 +118,7 @@ Se você executar o aplicativo, verá um "Olá, mundo!" mensagem na página.
Derivado `HomeController`de em `AbpController`vez de `Controller`classe padrão . Isso não é necessário, mas a `AbpController`classe possui propriedades e métodos base úteis para facilitar seu desenvolvimento.
## Usando Autofac como a estrutura de injeção de dependência
## Usando Autofac como framework de injeção de dependência
Embora o sistema de Injeção de Dependência (DI) do AspNet Core seja adequado para requisitos básicos, o Autofac fornece recursos avançados, como Injeção de Propriedade e Interceptação de Método, exigidos pela ABP para executar recursos avançados da estrutura de aplicativos.
@ -130,7 +130,7 @@ Substituir o sistema DI do AspNet Core pelo Autofac e integrar ao ABP é bastant
Install-Package Volo.Abp.Autofac
```
1. Adicionar `AbpAutofacModule`dependência
1. Adicionar `AbpAutofacModule` dependência
```csharp
[DependsOn(typeof(AbpAspNetCoreMvcModule))]
@ -141,7 +141,7 @@ public class AppModule : AbpModule
}
```
1. Altere a `services.AddApplication<AppModule>();`linha na `Startup`classe, como mostrado abaixo:
1. Altere a `services.AddApplication<AppModule>();` linha na `Startup`classe, como mostrado abaixo:
```csharp
services.AddApplication<AppModule>(options =>
@ -150,7 +150,7 @@ services.AddApplication<AppModule>(options =>
});
```
1. Atualize `Program.cs`para não usar o `WebHost.CreateDefaultBuilder()`método, pois ele usa o contêiner DI padrão:
1. Atualize `Program.cs` para não usar o `WebHost.CreateDefaultBuilder()` método, pois ele usa o contêiner DI padrão:
```csharp
public class Program

6
docs/pt-BR/Getting-Started-AspNetCore-MVC-Template.md

@ -20,7 +20,7 @@ abp new Acme.BookStore
> Você pode usar diferentes níveis de namespaces; por exemplo, BookStore, Acme.BookStore ou Acme.Retail.BookStore.
`new`O comando cria um **aplicativo MVC em camadas** com o **Entity Framework Core** como o provedor de banco de dados. No entanto, possui opções adicionais. Consulte a [documentação](CLI.md) da [CLI](CLI.md) para todas as opções disponíveis.
`new` O comando cria um **aplicativo MVC em camadas** com o **Entity Framework Core** como o provedor de banco de dados. No entanto, possui opções adicionais. Consulte a [documentação](CLI.md) da [CLI](CLI.md) para todas as opções disponíveis.
#### Pré requisitos
@ -41,7 +41,7 @@ A solução possui uma estrutura em camadas (baseada no [Domain Driven Design](D
### Cadeia de Conexão de Banco de Dados
Verifique a **cadeia de conexão** no `appsettings.json`arquivo no `.Web`projeto:
Verifique a **connection string** no `appsettings.json`arquivo no `.Web`projeto:
```json
{
@ -91,7 +91,7 @@ Verifique se o `.Web`projeto é o projeto de inicialização. Execute o aplicati
![livraria-homepage](images/bookstore-homepage.png)
Clique no botão **Login** , insira `admin`como nome de usuário e `1q2w3E*`senha para acessar o aplicativo.
Clique no botão **Login** , insira `admin` como nome de usuário e `1q2w3E*` senha para acessar o aplicativo.
O modelo de inicialização inclui os módulos de **gerenciamento de** **identidade** e **gerenciamento de inquilino** . Após o login, o menu Administração estará disponível, onde você poderá gerenciar **inquilinos** , **funções** , **usuários** e suas **permissões** . A página de gerenciamento de usuários é mostrada abaixo:

9
docs/pt-BR/Getting-Started-Console-Application.md

@ -10,7 +10,7 @@ Crie um novo aplicativo regular .Net Core Console do Visual Studio:
## Instale o pacote Volo.Abp
Volo.Abp.Core é o pacote principal de pepitas para criar aplicativos baseados em ABP. Então, instale-o no seu projeto:
Volo.Abp.Core é o pacote principal de nuget para criar aplicativos baseados em ABP. Então, instale-o no seu projeto:
```
Install-Package Volo.Abp.Core
@ -18,7 +18,7 @@ Install-Package Volo.Abp.Core
## Criar o primeiro módulo ABP
O ABP é uma estrutura modular e requer uma classe de **módulo de inicialização (raiz)** derivada de `AbpModule`:
O ABP é um framework modular e requer uma classe de **módulo de inicialização (raiz)** derivada de `AbpModule`:
```csharp
using Microsoft.Extensions.DependencyInjection;
@ -117,9 +117,9 @@ namespace AbpConsoleDemo
Embora seja suficiente para este exemplo de código simples, é sempre recomendável criar escopos no caso de resolver diretamente dependências de `IServiceProvider`(consulte a [documentação de Injeção de Dependências](Dependency-Injection.md)).
## Usando Autofac como a estrutura de injeção de dependência
## Usando Autofac como framework de injeção de dependência
Embora o sistema de Injeção de Dependência (DI) do AspNet Core seja adequado para requisitos básicos, o Autofac fornece recursos avançados, como Injeção de Propriedade e Interceptação de Método, exigidos pela ABP para executar recursos avançados da estrutura de aplicativos.
Embora o sistema de Injeção de Dependência (DI) do AspNet Core seja adequado para requisitos básicos, o Autofac fornece recursos avançados, como Injeção de Propriedade e Interceptação de Método, exigidos pela ABP para executar recursos avançados do framework de aplicativos.
Substituir o sistema DI do AspNet Core pelo Autofac e integrar ao ABP é bastante fácil.
@ -179,4 +179,3 @@ Apenas chamado `options.UseAutofac()`método nas `AbpApplicationFactory.Create`o
Obter código-fonte do projeto de exemplo criada neste tutorial a partir de [aqui](https://github.com/abpframework/abp/tree/master/samples/BasicConsoleApplication) .

21
docs/zh-Hans/Blog-Posts/2019-09-25 v0_21_Release/Post.md

@ -0,0 +1,21 @@
# 基于ASP.NET Core 3.0的ABP v0.21已发布
在微软发布仅仅一个小时后, 基于ASP.NET Core 3.0的ABP v0.21也紧跟着[发布了.](https://twitter.com/abpframework/status/1176185493119258624)
v0.21没有新功能.它只是升级到稳定的ASP.NET Core 3.0. 查看[v0.20发行说明](https://github.com/abpframework/abp/releases/tag/0.20.0)以获取新功能,增强功能和错误修复.
## 关于v1.0
ABP框架越来越接近v1.0.我们打算在今年10月中旬发布1.0. 现在,我们将完善测试和文档.
## .NET Conf 2019
微软已经在为期3天的虚拟会议.NET Conf 2019发布了ASP.NET Core 3.0. ABP的首席开发人员[Halil ibrahim Kalkan](https://twitter.com/hibrahimkalkan)在会议上也发表了讲话,介绍了ABP框架.能够参加这一重要活动真是太棒了.
## Techorama荷兰2019
[Techorama NL](https://techorama.nl/)是欧洲最大的会议之一.今年,Volosoft是会议的赞助商,并将有一个展位与软件开发人员讨论ABP框架和软件开发.我们的展位墙如下图所示:
![volosoft-booth](volosoft-booth.png)
如果您也参加会议,请到展位讨论ABP框架.我们还为您准备了一些私货:)

BIN
docs/zh-Hans/Blog-Posts/2019-09-25 v0_21_Release/volosoft-booth.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

4
framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj

@ -3,7 +3,7 @@
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>Volo.Abp.AspNetCore.Authentication.JwtBearer</AssemblyName>
<PackageId>Volo.Abp.AspNetCore.Authentication.JwtBearer</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
@ -18,7 +18,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.0.0" />
</ItemGroup>
</Project>

27
framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Properties/launchSettings.json

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:53450/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Volo.Abp.AspNetCore.Authentication.OAuth": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:53451/"
}
}
}

12
framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.csproj

@ -1,15 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk.Web">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>Volo.Abp.AspNetCore.Authentication.OAuth</AssemblyName>
<PackageId>Volo.Abp.AspNetCore.Authentication.OAuth</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<IsPackable>true</IsPackable>
<OutputType>Library</OutputType>
<RootNamespace />
</PropertyGroup>
@ -17,8 +19,4 @@
<ProjectReference Include="..\Volo.Abp.Security\Volo.Abp.Security.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Authentication.OAuth" Version="2.2.0" />
</ItemGroup>
</Project>
</Project>

27
framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo/Abp/AspNetCore/Authentication/OAuth/Claims/MultipleClaimAction.cs

@ -1,6 +1,6 @@
using System.Security.Claims;
using System.Text.Json;
using Microsoft.AspNetCore.Authentication.OAuth.Claims;
using Newtonsoft.Json.Linq;
namespace Volo.Abp.AspNetCore.Authentication.OAuth.Claims
{
@ -9,31 +9,30 @@ namespace Volo.Abp.AspNetCore.Authentication.OAuth.Claims
public MultipleClaimAction(string claimType, string jsonKey)
: base(claimType, jsonKey)
{
}
public override void Run(JObject userData, ClaimsIdentity identity, string issuer)
{
var prop = userData?.Property(ValueType);
if (prop == null)
public override void Run(JsonElement userData, ClaimsIdentity identity, string issuer)
{
var prop = userData.GetProperty(ValueType);
if (prop.ValueKind == JsonValueKind.Null)
{
return;
}
var propValue = prop.Value;
switch (propValue.Type)
switch (prop.ValueKind)
{
case JTokenType.String:
identity.AddClaim(new Claim(ClaimType, propValue.Value<string>(), ValueType, issuer));
case JsonValueKind.String:
identity.AddClaim(new Claim(ClaimType, prop.GetString(), ValueType, issuer));
break;
case JTokenType.Array:
foreach (var innterValue in propValue.Values<string>())
case JsonValueKind.Array:
foreach (var arramItem in prop.EnumerateArray())
{
identity.AddClaim(new Claim(ClaimType, innterValue, ValueType, issuer));
identity.AddClaim(new Claim(ClaimType, arramItem.GetString(), ValueType, issuer));
}
break;
default:
throw new AbpException("Unhandled JTokenType: " + propValue.Type);
throw new AbpException("Unhandled JsonValueKind: " + prop.ValueKind);
}
}
}

27
framework/src/Volo.Abp.AspNetCore.MultiTenancy/Properties/launchSettings.json

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:53760/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Volo.Abp.AspNetCore.MultiTenancy": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:53763/"
}
}
}

6
framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo.Abp.AspNetCore.MultiTenancy.csproj

@ -1,15 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk.Web">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>Volo.Abp.AspNetCore.MultiTenancy</AssemblyName>
<PackageId>Volo.Abp.AspNetCore.MultiTenancy</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<IsPackable>true</IsPackable>
<OutputType>Library</OutputType>
<RootNamespace />
</PropertyGroup>

27
framework/src/Volo.Abp.AspNetCore.Mvc.Client/Properties/launchSettings.json

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:52302/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Volo.Abp.AspNetCore.Mvc.Client": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:52303/"
}
}
}

6
framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.csproj

@ -1,15 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk.Web">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>Volo.Abp.AspNetCore.Mvc.Client</AssemblyName>
<PackageId>Volo.Abp.AspNetCore.Mvc.Client</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<IsPackable>true</IsPackable>
<OutputType>Library</OutputType>
<RootNamespace />
</PropertyGroup>

7
framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/CachedApplicationConfigurationClient.cs

@ -13,8 +13,7 @@ namespace Volo.Abp.AspNetCore.Mvc.Client
{
public class CachedApplicationConfigurationClient : ICachedApplicationConfigurationClient, ITransientDependency
{
public IHttpContextAccessor HttpContextAccessor { get; set; }
protected IHttpContextAccessor HttpContextAccessor { get; }
protected IHttpClientProxy<IAbpApplicationConfigurationAppService> Proxy { get; }
protected ICurrentUser CurrentUser { get; }
protected IDistributedCache<ApplicationConfigurationDto> Cache { get; }
@ -42,11 +41,11 @@ namespace Volo.Abp.AspNetCore.Mvc.Client
}
configuration = await Cache.GetOrAddAsync(
CreateCacheKey(),
cacheKey,
async () => await Proxy.Service.GetAsync(),
() => new DistributedCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(60) //TODO: Should be configurable. Default value should be higher (5 mins would be good).
AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(120) //TODO: Should be configurable. Default value should be higher (5 mins would be good).
}
);

116
framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/RemoteTenantStore.cs

@ -0,0 +1,116 @@
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Caching.Distributed;
using Volo.Abp.AspNetCore.Mvc.MultiTenancy;
using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http.Client.DynamicProxying;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Threading;
namespace Volo.Abp.AspNetCore.Mvc.Client
{
public class RemoteTenantStore : ITenantStore, ITransientDependency
{
protected IHttpClientProxy<IAbpTenantAppService> Proxy { get; }
protected IHttpContextAccessor HttpContextAccessor { get; }
protected IDistributedCache<TenantConfiguration> Cache { get; }
public RemoteTenantStore(
IHttpClientProxy<IAbpTenantAppService> proxy,
IHttpContextAccessor httpContextAccessor,
IDistributedCache<TenantConfiguration> cache)
{
Proxy = proxy;
HttpContextAccessor = httpContextAccessor;
Cache = cache;
}
public async Task<TenantConfiguration> FindAsync(string name)
{
var cacheKey = CreateCacheKey(name);
var httpContext = HttpContextAccessor?.HttpContext;
if (httpContext != null && httpContext.Items[cacheKey] is TenantConfiguration tenantConfiguration)
{
return tenantConfiguration;
}
tenantConfiguration = await Cache.GetOrAddAsync(
cacheKey,
async () => CreateTenantConfiguration(await Proxy.Service.FindTenantByNameAsync(name)),
() => new DistributedCacheEntryOptions
{
AbsoluteExpirationRelativeToNow =
TimeSpan.FromMinutes(5) //TODO: Should be configurable.
}
);
if (httpContext != null)
{
httpContext.Items[cacheKey] = tenantConfiguration;
}
return tenantConfiguration;
}
public async Task<TenantConfiguration> FindAsync(Guid id)
{
var cacheKey = CreateCacheKey(id);
var httpContext = HttpContextAccessor?.HttpContext;
if (httpContext != null && httpContext.Items[cacheKey] is TenantConfiguration tenantConfiguration)
{
return tenantConfiguration;
}
tenantConfiguration = await Cache.GetOrAddAsync(
cacheKey,
async () => CreateTenantConfiguration(await Proxy.Service.FindTenantByIdAsync(id)),
() => new DistributedCacheEntryOptions
{
AbsoluteExpirationRelativeToNow =
TimeSpan.FromMinutes(5) //TODO: Should be configurable.
}
);
if (httpContext != null)
{
httpContext.Items[cacheKey] = tenantConfiguration;
}
return tenantConfiguration;
}
public TenantConfiguration Find(string name)
{
return AsyncHelper.RunSync(() => FindAsync(name));
}
public TenantConfiguration Find(Guid id)
{
return AsyncHelper.RunSync(() => FindAsync(id));
}
protected virtual TenantConfiguration CreateTenantConfiguration(FindTenantResultDto tenantResultDto)
{
if (!tenantResultDto.Success || tenantResultDto.TenantId == null)
{
return null;
}
return new TenantConfiguration(tenantResultDto.TenantId.Value, tenantResultDto.Name);
}
protected virtual string CreateCacheKey(string tenantName)
{
return $"RemoteTenantStore_Name_{tenantName}";
}
protected virtual string CreateCacheKey(Guid tenantId)
{
return $"RemoteTenantStore_Id_{tenantId:N}";
}
}
}

2
framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo.Abp.AspNetCore.Mvc.Contracts.csproj

@ -3,7 +3,7 @@
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>Volo.Abp.AspNetCore.Mvc.Contracts</AssemblyName>
<PackageId>Volo.Abp.AspNetCore.Mvc.Contracts</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>

14
framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/FindTenantResultDto.cs

@ -0,0 +1,14 @@
using System;
namespace Volo.Abp.AspNetCore.Mvc.MultiTenancy
{
[Serializable]
public class FindTenantResultDto
{
public bool Success { get; set; }
public Guid? TenantId { get; set; }
public string Name { get; set; }
}
}

13
framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/IAbpTenantAppService.cs

@ -0,0 +1,13 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace Volo.Abp.AspNetCore.Mvc.MultiTenancy
{
public interface IAbpTenantAppService : IApplicationService
{
Task<FindTenantResultDto> FindTenantByNameAsync(string name);
Task<FindTenantResultDto> FindTenantByIdAsync(Guid id);
}
}

6
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs

@ -227,17 +227,17 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
if (string.IsNullOrEmpty(TagHelper.Label))
{
return await GetLabelAsHtmlUsingTagHelperAsync(context, output, isCheckbox) + GetRequiredSymbol(context, output, inputTag);
return await GetLabelAsHtmlUsingTagHelperAsync(context, output, isCheckbox) + GetRequiredSymbol(context, output);
}
var checkboxClass = isCheckbox ? "class=\"custom-control-label\" " : "";
return "<label " + checkboxClass + GetIdAttributeAsString(inputTag) + ">"
+ TagHelper.Label +
"</label>" + GetRequiredSymbol(context, output, inputTag);
"</label>" + GetRequiredSymbol(context, output);
}
protected virtual string GetRequiredSymbol(TagHelperContext context, TagHelperOutput output, TagHelperOutput inputTag)
protected virtual string GetRequiredSymbol(TagHelperContext context, TagHelperOutput output)
{
if (!TagHelper.DisplayRequiredSymbol)
{

6
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.csproj

@ -1,13 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.Razor">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>Volo.Abp.AspNetCore.Mvc.UI.Bootstrap</AssemblyName>
<PackageId>Volo.Abp.AspNetCore.Mvc.UI.Bootstrap</PackageId>
<IsPackable>true</IsPackable>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<IsPackable>true</IsPackable>
<OutputType>Library</OutputType>
</PropertyGroup>

27
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Properties/launchSettings.json

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:53762/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Volo.Abp.AspNetCore.Mvc.UI.Bundling": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:53765/"
}
}
}

6
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo.Abp.AspNetCore.Mvc.UI.Bundling.csproj

@ -1,11 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk.Razor">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>Volo.Abp.AspNetCore.Mvc.UI.Bundling</AssemblyName>
<PackageId>Volo.Abp.AspNetCore.Mvc.UI.Bundling</PackageId>
<IsPackable>true</IsPackable>
<OutputType>Library</OutputType>
<RootNamespace />
</PropertyGroup>

11
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs

@ -4,6 +4,7 @@ using System.Collections.Immutable;
using System.Linq;
using System.Text;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
@ -23,7 +24,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling
protected readonly BundlingOptions Options;
protected readonly BundleContributorOptions ContributorOptions;
protected readonly IWebContentFileProvider WebContentFileProvider;
protected readonly IHostingEnvironment HostingEnvironment;
protected readonly IWebHostEnvironment HostingEnvironment;
protected readonly IScriptBundler ScriptBundler;
protected readonly IStyleBundler StyleBundler;
protected readonly IServiceProvider ServiceProvider;
@ -36,7 +37,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling
IOptions<BundleContributorOptions> contributorOptions,
IScriptBundler scriptBundler,
IStyleBundler styleBundler,
IHostingEnvironment hostingEnvironment,
IWebHostEnvironment hostingEnvironment,
IServiceProvider serviceProvider,
IDynamicFileProvider dynamicFileProvider,
IBundleCache bundleCache,
@ -138,11 +139,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling
DynamicFileProvider.AddOrUpdate(
new InMemoryFileInfo(
Encoding.UTF8.GetBytes(bundleResult.Content),
"/wwwroot/" + bundleRelativePath, //TODO: get rid of wwwroot!
Encoding.UTF8.GetBytes(bundleResult.Content),
fileName
)
);
)
);
}
protected virtual bool IsBundlingEnabled()

4
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Styles/StyleBundler.cs

@ -8,10 +8,10 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.Styles
{
public class StyleBundler : BundlerBase, IStyleBundler
{
private readonly IHostingEnvironment _hostingEnvironment;
private readonly IWebHostEnvironment _hostingEnvironment;
public override string FileExtension => "css";
public StyleBundler(IWebContentFileProvider webContentFileProvider, ICssMinifier minifier, IHostingEnvironment hostingEnvironment)
public StyleBundler(IWebContentFileProvider webContentFileProvider, ICssMinifier minifier, IWebHostEnvironment hostingEnvironment)
: base(webContentFileProvider, minifier)
{
_hostingEnvironment = hostingEnvironment;

6
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs

@ -19,14 +19,14 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers
protected IBundleManager BundleManager { get; }
protected IWebContentFileProvider WebContentFileProvider { get; }
protected IHostingEnvironment HostingEnvironment { get; }
protected IWebHostEnvironment HostingEnvironment { get; }
protected readonly BundlingOptions Options;
protected AbpTagHelperResourceService(
IBundleManager bundleManager,
IWebContentFileProvider webContentFileProvider,
IOptions<BundlingOptions> options,
IHostingEnvironment hostingEnvironment)
IOptions<BundlingOptions> options,
IWebHostEnvironment hostingEnvironment)
{
BundleManager = bundleManager;
WebContentFileProvider = webContentFileProvider;

3
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
using Volo.Abp.AspNetCore.VirtualFileSystem;
@ -14,7 +15,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers
IBundleManager bundleManager,
IWebContentFileProvider webContentFileProvider,
IOptions<BundlingOptions> options,
IHostingEnvironment hostingEnvironment
IWebHostEnvironment hostingEnvironment
) : base(
bundleManager,
webContentFileProvider,

3
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperStyleService.cs

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
using Volo.Abp.AspNetCore.VirtualFileSystem;
@ -14,7 +15,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers
IBundleManager bundleManager,
IWebContentFileProvider webContentFileProvider,
IOptions<BundlingOptions> options,
IHostingEnvironment hostingEnvironment
IWebHostEnvironment hostingEnvironment
) : base(
bundleManager,
webContentFileProvider,

52
framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/AbpTenantAppService.cs

@ -0,0 +1,52 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
using Volo.Abp.AspNetCore.Mvc.MultiTenancy;
using Volo.Abp.MultiTenancy;
namespace Pages.Abp.MultiTenancy
{
public class AbpTenantAppService : ApplicationService, IAbpTenantAppService
{
protected ITenantStore TenantStore { get; }
public AbpTenantAppService(ITenantStore tenantStore)
{
TenantStore = tenantStore;
}
public async Task<FindTenantResultDto> FindTenantByNameAsync(string name)
{
var tenant = await TenantStore.FindAsync(name);
if (tenant == null)
{
return new FindTenantResultDto { Success = false };
}
return new FindTenantResultDto
{
Success = true,
TenantId = tenant.Id,
Name = tenant.Name
};
}
public async Task<FindTenantResultDto> FindTenantByIdAsync(Guid id)
{
var tenant = await TenantStore.FindAsync(id);
if (tenant == null)
{
return new FindTenantResultDto { Success = false };
}
return new FindTenantResultDto
{
Success = true,
TenantId = tenant.Id,
Name = tenant.Name
};
}
}
}

37
framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/AbpTenantController.cs

@ -1,37 +1,34 @@
using System.Threading.Tasks;
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.MultiTenancy;
using Volo.Abp.AspNetCore.Mvc.MultiTenancy;
namespace Pages.Abp.MultiTenancy
{
[Route("api/abp/multi-tenancy")]
public class AbpTenantController : AbpController
public class AbpTenantController : AbpController, IAbpTenantAppService
{
private readonly IAbpTenantAppService _abpTenantAppService;
protected ITenantStore TenantStore { get; }
public AbpTenantController(ITenantStore tenantStore)
public AbpTenantController(IAbpTenantAppService abpTenantAppService)
{
TenantStore = tenantStore;
_abpTenantAppService = abpTenantAppService;
}
[HttpGet]
[Route("find-tenant/{name}")]
public async Task<FindTenantResult> FindTenantAsync(string name)
[Route("find-tenant/{name}")] //TODO: Remove on v1.0
[Route("tenants/by-name/{name}")]
public async Task<FindTenantResultDto> FindTenantByNameAsync(string name)
{
var tenant = await TenantStore.FindAsync(name);
if (tenant == null)
{
return new FindTenantResult{Success = false};
}
return await _abpTenantAppService.FindTenantByNameAsync(name);
}
return new FindTenantResult
{
Success = true,
TenantId = tenant.Id
};
[HttpGet]
[Route("tenants/by-id/{id}")]
public async Task<FindTenantResultDto> FindTenantByIdAsync(Guid id)
{
return await _abpTenantAppService.FindTenantByIdAsync(id);
}
}
}

11
framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/FindTenantResult.cs

@ -1,11 +0,0 @@
using System;
namespace Pages.Abp.MultiTenancy
{
public class FindTenantResult
{
public bool Success { get; set; }
public Guid? TenantId { get; set; }
}
}

4
framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.csproj

@ -1,9 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.Razor">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy</AssemblyName>
<PackageId>Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>

12
framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/es-mx.json

@ -0,0 +1,12 @@
{
"culture": "es-MX",
"texts": {
"GivenTenantIsNotAvailable": "El inquilino {0} no está disponible",
"Tenant": "Inquilino",
"Switch": "cambiar",
"Name": "Nombre",
"SwitchTenant": "Cambiar inquilino",
"SwitchTenantHint": "Deje en blanco el campo nombre para cambiar el lado del host.",
"NotSelected": "No seleccionado"
}
}

27
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Properties/launchSettings.json

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:53766/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Volo.Abp.AspNetCore.Mvc.UI.Packages": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:53768/"
}
}
}

6
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo.Abp.AspNetCore.Mvc.UI.Packages.csproj

@ -1,11 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk.Razor">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>Volo.Abp.AspNetCore.Mvc.UI.Packages</AssemblyName>
<PackageId>Volo.Abp.AspNetCore.Mvc.UI.Packages</PackageId>
<IsPackable>true</IsPackable>
<OutputType>Library</OutputType>
<RootNamespace />
</PropertyGroup>

2
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Components/Toolbar/UserMenu/Default.cshtml

@ -21,7 +21,7 @@
var cssClass = string.IsNullOrEmpty(menuItem.CssClass) ? string.Empty : menuItem.CssClass;
var disabled = menuItem.IsDisabled ? "disabled" : string.Empty;
<a class="dropdown-item @cssClass @disabled" href="@(menuItem.Url ?? "#")" @Html.Raw(elementId)>
<a class="dropdown-item @cssClass @disabled" href="@(menuItem.Url ?? "#")" target="@menuItem.Target" @Html.Raw(elementId)>
@menuItem.DisplayName
</a>
}

4
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj

@ -1,9 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.Razor">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic</AssemblyName>
<PackageId>Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>

8
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.csproj

@ -1,9 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.Razor">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared</AssemblyName>
<PackageId>Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
@ -32,10 +32,6 @@
<None Include="Properties\launchSettings.json" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="2.2.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.AspNetCore.Mvc.UI.Bootstrap\Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.csproj" />
<ProjectReference Include="..\Volo.Abp.AspNetCore.Mvc.UI.Packages\Volo.Abp.AspNetCore.Mvc.UI.Packages.csproj" />

27
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Properties/launchSettings.json

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:53761/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Volo.Abp.AspNetCore.Mvc.UI.Widgets": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:53764/"
}
}
}

6
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo.Abp.AspNetCore.Mvc.UI.Widgets.csproj

@ -1,11 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk.Razor">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>Volo.Abp.AspNetCore.Mvc.UI.Widgets</AssemblyName>
<PackageId>Volo.Abp.AspNetCore.Mvc.UI.Widgets</PackageId>
<IsPackable>true</IsPackable>
<OutputType>Library</OutputType>
<RootNamespace />
</PropertyGroup>

6
framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo.Abp.AspNetCore.Mvc.UI.csproj

@ -1,12 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk.Razor">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>Volo.Abp.AspNetCore.Mvc.UI</AssemblyName>
<PackageId>Volo.Abp.AspNetCore.Mvc.UI</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<IsPackable>true</IsPackable>
<OutputType>Library</OutputType>
<RootNamespace />
</PropertyGroup>

16
framework/src/Volo.Abp.AspNetCore.Mvc/Microsoft/AspNetCore/Builder/AbpAspNetCoreMvcApplicationBuilderExtensions.cs

@ -17,19 +17,15 @@ namespace Microsoft.AspNetCore.Builder
/// <returns>A reference to this instance after the operation has completed.</returns>
public static IApplicationBuilder UseMvcWithDefaultRouteAndArea(
this IApplicationBuilder app,
Action<IRouteBuilder> additionalConfigurationAction = null)
Action<IEndpointRouteBuilder> additionalConfigurationAction = null)
{
return app.UseMvc(routes =>
return app.UseEndpoints(endpoints =>
{
routes.MapRoute(
name: "defaultWithArea",
template: "{area}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute("defaultWithArea", "{area}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
additionalConfigurationAction?.Invoke(routes);
additionalConfigurationAction?.Invoke(endpoints);
});
}
}

27
framework/src/Volo.Abp.AspNetCore.Mvc/Properties/launchSettings.json

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:53767/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Volo.Abp.AspNetCore.Mvc": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:53769/"
}
}
}

10
framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj

@ -1,15 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk.Razor">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>Volo.Abp.AspNetCore.Mvc</AssemblyName>
<PackageId>Volo.Abp.AspNetCore.Mvc</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<IsPackable>true</IsPackable>
<OutputType>Library</OutputType>
<RootNamespace />
</PropertyGroup>
@ -22,8 +24,8 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="3.1.5" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="4.0.0-preview8.19405.7" />
</ItemGroup>
</Project>

19
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs

@ -3,12 +3,11 @@ using Microsoft.AspNetCore.Mvc.ApplicationParts;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.AspNetCore.Mvc.ViewComponents;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
using Newtonsoft.Json.Serialization;
using Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation;
using System;
using System.Collections.Generic;
using System.Linq;
@ -16,7 +15,6 @@ using System.Reflection;
using Volo.Abp.ApiVersioning;
using Volo.Abp.AspNetCore.Mvc.Conventions;
using Volo.Abp.AspNetCore.Mvc.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc.Json;
using Volo.Abp.AspNetCore.Mvc.Localization;
using Volo.Abp.AspNetCore.VirtualFileSystem;
using Volo.Abp.DependencyInjection;
@ -45,8 +43,8 @@ namespace Volo.Abp.AspNetCore.Mvc
{
//Configure Razor
context.Services.Insert(0,
ServiceDescriptor.Singleton<IConfigureOptions<RazorViewEngineOptions>>(
new ConfigureOptions<RazorViewEngineOptions>(options =>
ServiceDescriptor.Singleton<IConfigureOptions<MvcRazorRuntimeCompilationOptions>>(
new ConfigureOptions<MvcRazorRuntimeCompilationOptions>(options =>
{
options.FileProviders.Add(
new RazorViewEngineVirtualFileProvider(
@ -78,6 +76,7 @@ namespace Volo.Abp.AspNetCore.Mvc
);
var mvcBuilder = context.Services.AddMvc()
.AddRazorRuntimeCompilation()
.AddDataAnnotationsLocalization(options =>
{
@ -86,7 +85,7 @@ namespace Volo.Abp.AspNetCore.Mvc
var resourceType = abpMvcDataAnnotationsLocalizationOptions.AssemblyResources.GetOrDefault(type.Assembly);
return factory.Create(resourceType ?? type);
};
})
})
.AddViewLocalization(); //TODO: How to configure from the application? Also, consider to move to a UI module since APIs does not care about it.
context.Services.ExecutePreConfiguredActions(mvcBuilder);
@ -112,10 +111,10 @@ namespace Volo.Abp.AspNetCore.Mvc
mvcOptions.AddAbp(context.Services);
});
Configure<MvcJsonOptions>(jsonOptions =>
{
jsonOptions.SerializerSettings.ContractResolver = new AbpMvcJsonContractResolver(context.Services);
});
//Configure<MvcJsonOptions>(jsonOptions => @3.0.0!
//{
// jsonOptions.SerializerSettings.ContractResolver = new AbpMvcJsonContractResolver(context.Services);
//});
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)

2
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/AbpServiceConvention.cs

@ -4,8 +4,8 @@ using System.Linq;
using System.Reflection;
using JetBrains.Annotations;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ActionConstraints;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.AspNetCore.Mvc.Internal;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.Extensions.Options;
using Volo.Abp.Application.Services;

39
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DependencyInjection/AbpAspNetCoreMvcConventionalDependencyRegistrar.cs

@ -7,24 +7,43 @@ using Volo.Abp.DependencyInjection;
namespace Volo.Abp.AspNetCore.Mvc.DependencyInjection
{
public class AbpAspNetCoreMvcConventionalRegistrar : DefaultConventionalRegistrar
public class AbpAspNetCoreMvcConventionalRegistrar : ConventionalRegistrarBase
{
protected override ServiceLifetime? GetServiceLifetimeFromClassHierarcy(Type type)
public override void AddType(IServiceCollection services, Type type)
{
var lifeTime = base.GetServiceLifetimeFromClassHierarcy(type);
if (lifeTime != null)
if (IsConventionalRegistrationDisabled(type))
{
return lifeTime;
return;
}
if (IsController(type) ||
IsPageModel(type) ||
IsViewComponent(type))
if (!IsMvcService(type))
{
return ServiceLifetime.Transient;
return;
}
return null;
var lifeTime = GetMvcServiceLifetime(type);
var serviceTypes = ExposedServiceExplorer.GetExposedServices(type);
TriggerServiceExposing(services, type, serviceTypes);
foreach (var serviceType in serviceTypes)
{
var serviceDescriptor = ServiceDescriptor.Describe(serviceType, type, lifeTime);
services.Add(serviceDescriptor);
}
}
protected virtual bool IsMvcService(Type type)
{
return IsController(type) ||
IsPageModel(type) ||
IsViewComponent(type);
}
protected virtual ServiceLifetime GetMvcServiceLifetime(Type type)
{
return ServiceLifetime.Transient;
}
private static bool IsPageModel(Type type)

27
framework/src/Volo.Abp.AspNetCore.TestBase/Properties/launchSettings.json

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:53783/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Volo.Abp.AspNetCore.TestBase": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:53784/"
}
}
}

8
framework/src/Volo.Abp.AspNetCore.TestBase/Volo.Abp.AspNetCore.TestBase.csproj

@ -1,15 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk.Web">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>Volo.Abp.AspNetCore.TestBase</AssemblyName>
<PackageId>Volo.Abp.AspNetCore.TestBase</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<IsPackable>true</IsPackable>
<OutputType>Library</OutputType>
<RootNamespace />
</PropertyGroup>
@ -20,7 +22,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="3.0.0" />
</ItemGroup>
</Project>

9
framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/DynamicProxying/AspNetCoreTestDynamicProxyHttpClientFactory.cs

@ -8,11 +8,11 @@ namespace Volo.Abp.AspNetCore.TestBase.DynamicProxying
public class AspNetCoreTestDynamicProxyHttpClientFactory : IDynamicProxyHttpClientFactory, ITransientDependency
{
private readonly ITestServerAccessor _testServerAccessor;
private readonly IHttpClientFactory _httpClientFactory;
public AspNetCoreTestDynamicProxyHttpClientFactory(ITestServerAccessor testServerAccessor, IHttpClientFactory httpClientFactory) {
public AspNetCoreTestDynamicProxyHttpClientFactory(
ITestServerAccessor testServerAccessor)
{
_testServerAccessor = testServerAccessor;
_httpClientFactory = httpClientFactory;
}
public HttpClient Create()
@ -20,7 +20,8 @@ namespace Volo.Abp.AspNetCore.TestBase.DynamicProxying
return _testServerAccessor.Server.CreateClient();
}
public HttpClient Create(string name) {
public HttpClient Create(string name)
{
return Create();
}
}

57
framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs

@ -1,9 +1,6 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using JetBrains.Annotations;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.RequestLocalization;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp;
using Volo.Abp.AspNetCore.Auditing;
@ -11,9 +8,6 @@ using Volo.Abp.AspNetCore.Mvc.ExceptionHandling;
using Volo.Abp.AspNetCore.Tracing;
using Volo.Abp.AspNetCore.Uow;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Localization;
using Volo.Abp.Settings;
using Volo.Abp.Threading;
namespace Microsoft.AspNetCore.Builder
{
@ -50,40 +44,11 @@ namespace Microsoft.AspNetCore.Builder
public static IApplicationBuilder UseAbpRequestLocalization(this IApplicationBuilder app, Action<RequestLocalizationOptions> optionsAction = null)
{
IReadOnlyList<LanguageInfo> languages;
string defaultLanguage;
app.ApplicationServices
.GetRequiredService<IAbpRequestLocalizationOptionsProvider>()
.InitLocalizationOptions(optionsAction);
using (var scope = app.ApplicationServices.CreateScope())
{
var languageProvider = scope.ServiceProvider.GetRequiredService<ILanguageProvider>();
languages = AsyncHelper.RunSync(() => languageProvider.GetLanguagesAsync());
var settingProvider = scope.ServiceProvider.GetRequiredService<ISettingProvider>();
defaultLanguage = AsyncHelper.RunSync(() => settingProvider.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage));
}
var options = !languages.Any()
? new RequestLocalizationOptions()
: new RequestLocalizationOptions
{
DefaultRequestCulture = DefaultGetRequestCulture(defaultLanguage, languages),
SupportedCultures = languages
.Select(l => l.CultureName)
.Distinct()
.Select(c => new CultureInfo(c))
.ToArray(),
SupportedUICultures = languages
.Select(l => l.UiCultureName)
.Distinct()
.Select(c => new CultureInfo(c))
.ToArray()
};
optionsAction?.Invoke(options);
return app.UseRequestLocalization(options);
return app.UseMiddleware<AbpRequestLocalizationMiddleware>();
}
public static IApplicationBuilder UseAbpExceptionHandling(this IApplicationBuilder app)
@ -96,17 +61,5 @@ namespace Microsoft.AspNetCore.Builder
app.Properties[ExceptionHandlingMiddlewareMarker] = true;
return app.UseMiddleware<AbpExceptionHandlingMiddleware>();
}
private static RequestCulture DefaultGetRequestCulture(string defaultLanguage, IReadOnlyList<LanguageInfo> languages)
{
if (defaultLanguage == null)
{
var firstLanguage = languages.First();
return new RequestCulture(firstLanguage.CultureName, firstLanguage.UiCultureName);
}
var (cultureName, uiCultureName) = LocalizationSettingHelper.ParseLanguageSetting(defaultLanguage);
return new RequestCulture(cultureName, uiCultureName);
}
}
}

2
framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Hosting/AbpHostingEnvironmentExtensions.cs

@ -6,7 +6,7 @@ namespace Microsoft.AspNetCore.Hosting
public static class AbpHostingEnvironmentExtensions
{
public static IConfigurationRoot BuildConfiguration(
this IHostingEnvironment env,
this IWebHostEnvironment env,
ConfigurationBuilderOptions options = null)
{
options = options ?? new ConfigurationBuilderOptions();

35
framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationMiddleware.cs

@ -0,0 +1,35 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Localization;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
namespace Microsoft.AspNetCore.RequestLocalization
{
public class AbpRequestLocalizationMiddleware : IMiddleware, ITransientDependency
{
private readonly IAbpRequestLocalizationOptionsProvider _requestLocalizationOptionsProvider;
private readonly ILoggerFactory _loggerFactory;
public AbpRequestLocalizationMiddleware(
IAbpRequestLocalizationOptionsProvider requestLocalizationOptionsProvider,
ILoggerFactory loggerFactory)
{
_requestLocalizationOptionsProvider = requestLocalizationOptionsProvider;
_loggerFactory = loggerFactory;
}
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
var middleware = new RequestLocalizationMiddleware(
next,
new OptionsWrapper<RequestLocalizationOptions>(_requestLocalizationOptionsProvider.GetLocalizationOptions()),
_loggerFactory
);
await middleware.Invoke(context);
}
}
}

80
framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs

@ -0,0 +1,80 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Localization;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Localization;
using Volo.Abp.Settings;
using Volo.Abp.Threading;
namespace Microsoft.AspNetCore.RequestLocalization
{
public class DefaultAbpRequestLocalizationOptionsProvider : IAbpRequestLocalizationOptionsProvider, ISingletonDependency
{
private readonly IServiceProvider _serviceProvider;
private Lazy<RequestLocalizationOptions> _lazyRequestLocalizationOptions;
public DefaultAbpRequestLocalizationOptionsProvider(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public void InitLocalizationOptions(Action<RequestLocalizationOptions> optionsAction = null)
{
_lazyRequestLocalizationOptions = new Lazy<RequestLocalizationOptions>(() =>
{
using (var serviceScope = _serviceProvider.CreateScope())
{
var languageProvider = serviceScope.ServiceProvider.GetRequiredService<ILanguageProvider>();
var settingProvider = serviceScope.ServiceProvider.GetRequiredService<ISettingProvider>();
var languages = AsyncHelper.RunSync(languageProvider.GetLanguagesAsync);
var defaultLanguage = AsyncHelper.RunSync(() =>
settingProvider.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage));
var options = !languages.Any()
? new RequestLocalizationOptions()
: new RequestLocalizationOptions
{
DefaultRequestCulture = DefaultGetRequestCulture(defaultLanguage, languages),
SupportedCultures = languages
.Select(l => l.CultureName)
.Distinct()
.Select(c => new CultureInfo(c))
.ToArray(),
SupportedUICultures = languages
.Select(l => l.UiCultureName)
.Distinct()
.Select(c => new CultureInfo(c))
.ToArray()
};
optionsAction?.Invoke(options);
return options;
}
}, true);
}
public RequestLocalizationOptions GetLocalizationOptions()
{
return _lazyRequestLocalizationOptions.Value;
}
private static RequestCulture DefaultGetRequestCulture(string defaultLanguage, IReadOnlyList<LanguageInfo> languages)
{
if (defaultLanguage == null)
{
var firstLanguage = languages.First();
return new RequestCulture(firstLanguage.CultureName, firstLanguage.UiCultureName);
}
var (cultureName, uiCultureName) = LocalizationSettingHelper.ParseLanguageSetting(defaultLanguage);
return new RequestCulture(cultureName, uiCultureName);
}
}
}

12
framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/IAbpRequestLocalizationOptionsProvider.cs

@ -0,0 +1,12 @@
using System;
using Microsoft.AspNetCore.Builder;
namespace Microsoft.AspNetCore.RequestLocalization
{
public interface IAbpRequestLocalizationOptionsProvider
{
void InitLocalizationOptions(Action<RequestLocalizationOptions> optionsAction = null);
RequestLocalizationOptions GetLocalizationOptions();
}
}

4
framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/AbpAspNetCoreServiceCollectionExtensions.cs

@ -5,9 +5,9 @@ namespace Microsoft.Extensions.DependencyInjection
{
public static class AbpAspNetCoreServiceCollectionExtensions
{
public static IHostingEnvironment GetHostingEnvironment(this IServiceCollection services)
public static IWebHostEnvironment GetHostingEnvironment(this IServiceCollection services)
{
return services.GetSingletonInstance<IHostingEnvironment>();
return services.GetSingletonInstance<IWebHostEnvironment>();
}
public static IConfigurationRoot BuildConfiguration(this IServiceCollection services, ConfigurationBuilderOptions options = null)

27
framework/src/Volo.Abp.AspNetCore/Properties/launchSettings.json

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:53374/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Volo.Abp.AspNetCore": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:53375/"
}
}
}

15
framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj

@ -1,15 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk.Web">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>Volo.Abp.AspNetCore</AssemblyName>
<PackageId>Volo.Abp.AspNetCore</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<IsPackable>true</IsPackable>
<OutputType>Library</OutputType>
<RootNamespace />
</PropertyGroup>
@ -26,13 +28,4 @@
<ProjectReference Include="..\Volo.Abp.VirtualFileSystem\Volo.Abp.VirtualFileSystem.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Routing.Abstractions" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Localization" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Cors" Version="2.2.0" />
</ItemGroup>
</Project>

4
framework/src/Volo.Abp.AspNetCore/Volo/Abp/ApplicationInitializationContextExtensions.cs

@ -13,9 +13,9 @@ namespace Volo.Abp
return context.ServiceProvider.GetRequiredService<IObjectAccessor<IApplicationBuilder>>().Value;
}
public static IHostingEnvironment GetEnvironment(this ApplicationInitializationContext context)
public static IWebHostEnvironment GetEnvironment(this ApplicationInitializationContext context)
{
return context.ServiceProvider.GetRequiredService<IHostingEnvironment>();
return context.ServiceProvider.GetRequiredService<IWebHostEnvironment>();
}
public static ILoggerFactory GetLoggerFactory(this ApplicationInitializationContext context)

6
framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/VirtualFileSystem/WebContentFileProvider.cs

@ -14,14 +14,14 @@ namespace Volo.Abp.AspNetCore.VirtualFileSystem
{
private readonly IVirtualFileProvider _virtualFileProvider;
private readonly IFileProvider _fileProvider;
private readonly IHostingEnvironment _hostingEnvironment;
private readonly IWebHostEnvironment _hostingEnvironment;
private string _rootPath = "/wwwroot"; //TODO: How to handle wwwroot naming?
protected AspNetCoreContentOptions Options { get; }
public WebContentFileProvider(
IVirtualFileProvider virtualFileProvider,
IHostingEnvironment hostingEnvironment,
IVirtualFileProvider virtualFileProvider,
IWebHostEnvironment hostingEnvironment,
IOptions<AspNetCoreContentOptions> options)
{
_virtualFileProvider = virtualFileProvider;

2
framework/src/Volo.Abp.Authorization/Volo.Abp.Authorization.csproj

@ -14,7 +14,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Authorization" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Authorization" Version="3.0.0" />
</ItemGroup>
<ItemGroup>

2
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs

@ -25,7 +25,7 @@ namespace Volo.Abp.Authorization
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddAuthorization();
context.Services.AddAuthorizationCore();
context.Services.AddSingleton<IAuthorizationHandler, PermissionRequirementHandler>();

2
framework/src/Volo.Abp.Autofac/Volo.Abp.Autofac.csproj

@ -15,7 +15,7 @@
<ItemGroup>
<PackageReference Include="Autofac.Extras.DynamicProxy" Version="4.5.0" />
<PackageReference Include="Autofac" Version="4.9.3" />
<PackageReference Include="Autofac" Version="4.9.4" />
</ItemGroup>
<ItemGroup>

4
framework/src/Volo.Abp.Caching/Volo.Abp.Caching.csproj

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
@ -14,7 +14,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="3.0.0" />
</ItemGroup>
<ItemGroup>

6
framework/src/Volo.Abp.Caching/Volo/Abp/Caching/CacheOptions.cs

@ -6,6 +6,11 @@ namespace Volo.Abp.Caching
{
public class CacheOptions
{
/// <summary>
/// Cache key prefix.
/// </summary>
public string KeyPrefix { get; set; }
/// <summary>
/// Global Cache entry options.
/// </summary>
@ -21,6 +26,7 @@ namespace Volo.Abp.Caching
{
CacheConfigurators = new List<Func<string, DistributedCacheEntryOptions>>();
GlobalCacheEntryOptions = new DistributedCacheEntryOptions();
KeyPrefix = "";
}
}
}

2
framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs

@ -405,7 +405,7 @@ namespace Volo.Abp.Caching
protected virtual string NormalizeKey(string key)
{
var normalizedKey = "c:" + CacheName + ",k:" + key;
var normalizedKey = "c:" + CacheName + ",k:" + _cacheOption.KeyPrefix + key;
if (!IgnoreMultiTenancy && CurrentTenant.Id.HasValue)
{

18
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs

@ -169,8 +169,16 @@ namespace Volo.Abp.Cli
}
}
private static bool IsGlobalTool(string toolPath)
{
var globalPaths = new[] { @"%USERPROFILE%\.dotnet\tools\", "%HOME%/.dotnet/tools/", };
return globalPaths.Select(Environment.ExpandEnvironmentVariables).Contains(toolPath);
}
private void LogNewVersionInfo(UpdateChannel updateChannel, SemanticVersion latestVersion, string toolPath)
{
var toolPathArg = IsGlobalTool(toolPath) ? "-g" : $"--tool-path {toolPath}";
Logger.LogWarning($"ABP CLI has a newer {updateChannel.ToString().ToLowerInvariant()} version {latestVersion}, please update to get the latest features and fixes.");
Logger.LogWarning(string.Empty);
Logger.LogWarning("Update Command: ");
@ -179,18 +187,18 @@ namespace Volo.Abp.Cli
switch (updateChannel)
{
case UpdateChannel.Stable:
Logger.LogWarning("dotnet tool update -g Volo.Abp.Cli");
Logger.LogWarning($"dotnet tool update {toolPathArg} Volo.Abp.Cli");
break;
case UpdateChannel.Prerelease:
Logger.LogWarning("dotnet tool uninstall -g Volo.Abp.Cli");
Logger.LogWarning($"dotnet tool install -g Volo.Abp.Cli --version {latestVersion}");
Logger.LogWarning($"dotnet tool uninstall {toolPathArg} Volo.Abp.Cli");
Logger.LogWarning($"dotnet tool install {toolPathArg} Volo.Abp.Cli --version {latestVersion}");
break;
case UpdateChannel.Nightly:
case UpdateChannel.Development:
Logger.LogWarning("dotnet tool uninstall -g Volo.Abp.Cli");
Logger.LogWarning($"dotnet tool install -g Volo.Abp.Cli --add-source https://www.myget.org/F/abp-nightly/api/v3/index.json --version {latestVersion}");
Logger.LogWarning($"dotnet tool uninstall {toolPathArg} Volo.Abp.Cli");
Logger.LogWarning($"dotnet tool install {toolPathArg} Volo.Abp.Cli --add-source https://www.myget.org/F/abp-nightly/api/v3/index.json --version {latestVersion}");
break;
default:
throw new ArgumentOutOfRangeException(nameof(updateChannel), updateChannel, null);

51
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs

@ -40,18 +40,29 @@ namespace Volo.Abp.Cli.Commands
Logger.LogInformation("Creating your project...");
Logger.LogInformation("Project name: " + commandLineArgs.Target);
commandLineArgs.Options.Add(CliConsts.Command, commandLineArgs.Command);
var template = commandLineArgs.Options.GetOrNull(Options.Template.Short, Options.Template.Long);
if (template != null)
{
Logger.LogInformation("Template: " + template);
}
var result = await ProjectBuilder.BuildAsync(
new ProjectBuildArgs(
SolutionName.Parse(commandLineArgs.Target),
commandLineArgs.Options.GetOrNull(Options.Template.Short, Options.Template.Long),
commandLineArgs.Options.GetOrNull(Options.Version.Short, Options.Version.Long),
GetDatabaseProvider(commandLineArgs),
GetUiFramework(commandLineArgs),
commandLineArgs.Options
)
);
var version = commandLineArgs.Options.GetOrNull(Options.Version.Short, Options.Version.Long);
if (version != null)
{
Logger.LogInformation("Version: " + version);
}
var databaseProvider = GetDatabaseProvider(commandLineArgs);
if (databaseProvider != DatabaseProvider.NotSpecified)
{
Logger.LogInformation("Database provider: " + databaseProvider);
}
var uiFramework = GetUiFramework(commandLineArgs);
if (uiFramework != UiFramework.NotSpecified)
{
Logger.LogInformation("UI Framework: " + uiFramework);
}
var outputFolder = commandLineArgs.Options.GetOrNull(Options.OutputFolder.Short, Options.OutputFolder.Long);
if (outputFolder != null)
@ -68,6 +79,21 @@ namespace Volo.Abp.Cli.Commands
outputFolder = Directory.GetCurrentDirectory();
}
Logger.LogInformation("Output folder: " + outputFolder);
commandLineArgs.Options.Add(CliConsts.Command, commandLineArgs.Command);
var result = await ProjectBuilder.BuildAsync(
new ProjectBuildArgs(
SolutionName.Parse(commandLineArgs.Target),
template,
version,
databaseProvider,
uiFramework,
commandLineArgs.Options
)
);
using (var templateFileStream = new MemoryStream(result.ZipContent))
{
using (var zipInputStream = new ZipInputStream(templateFileStream))
@ -101,8 +127,7 @@ namespace Volo.Abp.Cli.Commands
}
}
Logger.LogInformation($"Successfully created the project '{commandLineArgs.Target}'");
Logger.LogInformation($"The output folder is: '{outputFolder}'");
Logger.LogInformation($"'{commandLineArgs.Target}' has been successfully created to '{outputFolder}'");
}
public string GetUsageInfo()

1
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClient.cs

@ -2,6 +2,7 @@
using System.IO;
using System.Net.Http;
using System.Text;
using IdentityModel.Client;
namespace Volo.Abp.Cli.Http
{

4
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/AbpIoApiKeyService.cs

@ -15,7 +15,7 @@ namespace Volo.Abp.Cli.Licensing
protected IJsonSerializer JsonSerializer { get; }
public async Task<string> GetApiKeyOrNullAsync()
public async Task<DeveloperApiKeyResult> GetApiKeyOrNullAsync()
{
using (var client = new CliHttpClient())
{
@ -29,7 +29,7 @@ namespace Volo.Abp.Cli.Licensing
}
var responseContent = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<DeveloperApiKeyResult>(responseContent).ApiKey;
return JsonSerializer.Deserialize<DeveloperApiKeyResult>(responseContent);
}
}
}

2
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/IApiKeyService.cs

@ -5,6 +5,6 @@ namespace Volo.Abp.Cli.Licensing
{
public interface IApiKeyService
{
Task<string> GetApiKeyOrNullAsync();
Task<DeveloperApiKeyResult> GetApiKeyOrNullAsync();
}
}

7
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ProjectBuildPipelineBuilder.cs

@ -1,4 +1,5 @@
using Volo.Abp.Cli.ProjectBuilding.Building.Steps;
using Volo.Abp.Cli.ProjectBuilding.Templates.App;
namespace Volo.Abp.Cli.ProjectBuilding.Building
{
@ -19,6 +20,12 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building
pipeline.Steps.Add(new TemplateCodeDeleteStep());
pipeline.Steps.Add(new SolutionRenameStep());
if (context.Template.Name == AppProTemplate.TemplateName)
{
pipeline.Steps.Add(new LicenseCodeReplaceStep());
}
pipeline.Steps.Add(new CreateProjectResultZipStep());
return pipeline;

23
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/LicenseCodeReplaceStep.cs

@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Volo.Abp.Cli.ProjectBuilding.Files;
namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
{
public class LicenseCodeReplaceStep : ProjectBuildPipelineStep
{
public override void Execute(ProjectBuildContext context)
{
var licenseCode = context.BuildArgs.ExtraProperties.GetOrDefault("license-code");
var appSettingsJsonFiles = context.Files.Where(f =>
f.Name.EndsWith("appsettings.json", StringComparison.OrdinalIgnoreCase));
foreach (var appSettingsJson in appSettingsJsonFiles)
{
appSettingsJson.ReplaceText(@"<LICENSE_CODE/>", licenseCode);
}
}
}
}

14
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/NugetReferenceReplaceStep.cs

@ -19,8 +19,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
new NugetReferenceReplacer(
context.Files,
"MyCompanyName",
"MyProjectName",
"MyCompanyName.MyProjectName",
nugetPackageVersion
).Run();
}
@ -47,19 +46,16 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
private class NugetReferenceReplacer
{
private readonly List<FileEntry> _entries;
private readonly string _companyNamePlaceHolder;
private readonly string _projectNamePlaceHolder;
private readonly string _companyAndProjectNamePlaceHolder;
private readonly string _nugetPackageVersion;
public NugetReferenceReplacer(
List<FileEntry> entries,
string companyNamePlaceHolder,
string projectNamePlaceHolder,
string companyAndProjectNamePlaceHolder,
string nugetPackageVersion)
{
_entries = entries;
_companyNamePlaceHolder = companyNamePlaceHolder;
_projectNamePlaceHolder = projectNamePlaceHolder;
_companyAndProjectNamePlaceHolder = companyAndProjectNamePlaceHolder;
_nugetPackageVersion = nugetPackageVersion;
}
@ -96,7 +92,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
var oldNodeIncludeValue = oldNode.Attributes["Include"].Value;
// ReSharper disable once PossibleNullReferenceException : Can not be null because nodes are selected with include attribute filter in previous method
if (oldNodeIncludeValue.Contains($"{_companyNamePlaceHolder}.{_projectNamePlaceHolder}"))
if (oldNodeIncludeValue.Contains($"{_companyAndProjectNamePlaceHolder}"))
{
continue;
}

1
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenameStep.cs

@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Volo.Abp.Cli.ProjectBuilding.Files;
namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save