From 42443f6df68750c452375842c02064ec6f62f1f8 Mon Sep 17 00:00:00 2001 From: lonwern Date: Tue, 4 Jun 2019 17:19:08 +0800 Subject: [PATCH 1/6] Add optionsAction to UseAbpRequestLocalization --- .../AbpApplicationBuilderExtensions.cs | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs index 5f1c7ea4d8..25a9d38d06 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Globalization; using System.Linq; using JetBrains.Annotations; @@ -47,7 +48,7 @@ namespace Microsoft.AspNetCore.Builder .UseMiddleware(); } - public static IApplicationBuilder UseAbpRequestLocalization(this IApplicationBuilder app) + public static IApplicationBuilder UseAbpRequestLocalization(this IApplicationBuilder app, Action optionsAction = null) { IReadOnlyList languages; string defaultLanguage; @@ -61,28 +62,27 @@ namespace Microsoft.AspNetCore.Builder defaultLanguage = settingProvider.GetOrNull(LocalizationSettingNames.DefaultLanguage); } - if (!languages.Any()) - { - return app.UseRequestLocalization(); - } + 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); - var options = 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() - }; - return app.UseRequestLocalization(options); } From 026c9898f5882ba89da6ab98f6c0337df5cd9a99 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 5 Jun 2019 11:41:53 +0800 Subject: [PATCH 2/6] resolve #1197 Update links to the localization files. --- .../Contribution/Localization-Text-Files.md | 38 ++++++++++++++----- .../Contribution/Localization-Text-Files.md | 38 ++++++++++++++----- 2 files changed, 58 insertions(+), 18 deletions(-) diff --git a/docs/en/Contribution/Localization-Text-Files.md b/docs/en/Contribution/Localization-Text-Files.md index ed773a1d73..3932800575 100644 --- a/docs/en/Contribution/Localization-Text-Files.md +++ b/docs/en/Contribution/Localization-Text-Files.md @@ -2,19 +2,39 @@ Here, a list of localization text files for anyone wants to contribute to localization of the texts coming from the framework. We will keep this list up to date: -* https://github.com/abpframework/abp/tree/master/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json * https://github.com/abpframework/abp/tree/master/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json * https://github.com/abpframework/abp/tree/master/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Resources/AbpValidation/en.json +* https://github.com/abpframework/abp/tree/master/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/Localization/Resource/en.json +* https://github.com/abpframework/abp/tree/master/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json +* https://github.com/abpframework/abp/tree/master/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/Resource/en.json +* https://github.com/abpframework/abp/tree/master/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/en.json +* https://github.com/abpframework/abp/tree/master/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/CountryNames/en.json +* https://github.com/abpframework/abp/tree/master/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/Validation/en.json +* https://github.com/abpframework/abp/tree/master/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/en.json +* https://github.com/abpframework/abp/tree/master/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/SourceExt/en.json * https://github.com/abpframework/abp/tree/master/modules/account/src/Volo.Abp.Account.Web/Localization/Resources/AbpAccount/Web/en.json -* https://github.com/abpframework/abp/tree/master/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/en.json -* https://github.com/abpframework/abp/tree/master/modules/blogging/src/Volo.Blogging.Web/Localization/Resources/Blogging/Web/en.json * https://github.com/abpframework/abp/tree/master/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/Localization/Resources/Blogging/ApplicationContracts/en.json -* https://github.com/abpframework/abp/tree/master/modules/identity/src/Volo.Abp.Identity.Web/Localization/Resources/AbpIdentity/en.json -* https://github.com/abpframework/abp/tree/master/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/Localization/Domain/en.json +* https://github.com/abpframework/abp/tree/master/modules/blogging/src/Volo.Blogging.Web/Localization/Resources/Blogging/Web/en.json +* https://github.com/abpframework/abp/tree/master/modules/docs/app/VoloDocs.Web/Localization/Resources/VoloDocs/Web/en.json +* https://github.com/abpframework/abp/tree/master/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en.json +* https://github.com/abpframework/abp/tree/master/modules/docs/src/Volo.Docs.Admin.Web/Localization/Resources/Docs/Web/en.json +* https://github.com/abpframework/abp/tree/master/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/en.json +* https://github.com/abpframework/abp/tree/master/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/Localization/ApplicationContracts/en.json +* https://github.com/abpframework/abp/tree/master/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/Localization/Domain/en.json +* https://github.com/abpframework/abp/tree/master/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Localization/Resources/FeatureManagement/en.json * https://github.com/abpframework/abp/tree/master/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/Localization/ApplicationContracts/en.json +* https://github.com/abpframework/abp/tree/master/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/Localization/Domain/en.json +* https://github.com/abpframework/abp/tree/master/modules/identity/src/Volo.Abp.Identity.Web/Localization/Resources/AbpIdentity/en.json * https://github.com/abpframework/abp/tree/master/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Localization/Resources/AbpPermissionManagement/en.json -* https://github.com/abpframework/abp/tree/master/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Localization/Resources/AbpTenantManagement/Web/en.json +* https://github.com/abpframework/abp/tree/master/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Localization/Resources/AbpSettingManagement/en.json * https://github.com/abpframework/abp/tree/master/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/Localization/ApplicationContracts/en.json -* https://github.com/abpframework/abp/tree/master/templates/mvc/src/MyCompanyName.MyProjectName.Domain/Localization/MyProjectName/en.json -* https://github.com/abpframework/abp/tree/master/templates/module/src/MyCompanyName.MyProjectName.Domain/MyCompanyName/MyProjectName/Localization/Domain/en.json -* https://github.com/abpframework/abp/tree/master/templates/module/src/MyCompanyName.MyProjectName.Web/Localization/Resources/MyProjectName/en.json \ No newline at end of file +* https://github.com/abpframework/abp/tree/master/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Localization/Resources/AbpTenantManagement/Web/en.json +* https://github.com/abpframework/abp/tree/master/samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/en.json +* https://github.com/abpframework/abp/tree/master/samples/DashboardDemo/src/DashboardDemo.Domain/Localization/DashboardDemo/en.json +* https://github.com/abpframework/abp/tree/master/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application.Contracts/ProductManagement/Localization/ApplicationContracts/en.json +* https://github.com/abpframework/abp/tree/master/samples/MicroserviceDemo/modules/product/src/ProductManagement.Domain/ProductManagement/Localization/Domain/en.json +* https://github.com/abpframework/abp/tree/master/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/Localization/Resources/ProductManagement/en.json +* https://github.com/abpframework/abp/tree/master/templates/mvc-module/src/MyCompanyName.MyProjectName.Application.Contracts/Localization/MyProjectName/ApplicationContracts/en.json +* https://github.com/abpframework/abp/tree/master/templates/mvc-module/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/DomainShared/en.json +* https://github.com/abpframework/abp/tree/master/templates/mvc-module/src/MyCompanyName.MyProjectName.Web/Localization/MyProjectName/Web/en.json +* https://github.com/abpframework/abp/tree/master/templates/mvc/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/en.json diff --git a/docs/zh-Hans/Contribution/Localization-Text-Files.md b/docs/zh-Hans/Contribution/Localization-Text-Files.md index ad4bca1075..36bae2890a 100644 --- a/docs/zh-Hans/Contribution/Localization-Text-Files.md +++ b/docs/zh-Hans/Contribution/Localization-Text-Files.md @@ -2,19 +2,39 @@ 这是一个来自框架的本地化文本文件列表, 任何人都可以做出贡献. 我们会将此列表保持最新: -* https://github.com/abpframework/abp/tree/master/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json * https://github.com/abpframework/abp/tree/master/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json * https://github.com/abpframework/abp/tree/master/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Resources/AbpValidation/en.json +* https://github.com/abpframework/abp/tree/master/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/Localization/Resource/en.json +* https://github.com/abpframework/abp/tree/master/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json +* https://github.com/abpframework/abp/tree/master/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/Resource/en.json +* https://github.com/abpframework/abp/tree/master/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/en.json +* https://github.com/abpframework/abp/tree/master/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/CountryNames/en.json +* https://github.com/abpframework/abp/tree/master/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/Validation/en.json +* https://github.com/abpframework/abp/tree/master/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/en.json +* https://github.com/abpframework/abp/tree/master/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/SourceExt/en.json * https://github.com/abpframework/abp/tree/master/modules/account/src/Volo.Abp.Account.Web/Localization/Resources/AbpAccount/Web/en.json -* https://github.com/abpframework/abp/tree/master/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/en.json -* https://github.com/abpframework/abp/tree/master/modules/blogging/src/Volo.Blogging.Web/Localization/Resources/Blogging/Web/en.json * https://github.com/abpframework/abp/tree/master/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/Localization/Resources/Blogging/ApplicationContracts/en.json -* https://github.com/abpframework/abp/tree/master/modules/identity/src/Volo.Abp.Identity.Web/Localization/Resources/AbpIdentity/en.json -* https://github.com/abpframework/abp/tree/master/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/Localization/Domain/en.json +* https://github.com/abpframework/abp/tree/master/modules/blogging/src/Volo.Blogging.Web/Localization/Resources/Blogging/Web/en.json +* https://github.com/abpframework/abp/tree/master/modules/docs/app/VoloDocs.Web/Localization/Resources/VoloDocs/Web/en.json +* https://github.com/abpframework/abp/tree/master/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en.json +* https://github.com/abpframework/abp/tree/master/modules/docs/src/Volo.Docs.Admin.Web/Localization/Resources/Docs/Web/en.json +* https://github.com/abpframework/abp/tree/master/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/en.json +* https://github.com/abpframework/abp/tree/master/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/Localization/ApplicationContracts/en.json +* https://github.com/abpframework/abp/tree/master/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/Localization/Domain/en.json +* https://github.com/abpframework/abp/tree/master/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Localization/Resources/FeatureManagement/en.json * https://github.com/abpframework/abp/tree/master/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/Localization/ApplicationContracts/en.json +* https://github.com/abpframework/abp/tree/master/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/Localization/Domain/en.json +* https://github.com/abpframework/abp/tree/master/modules/identity/src/Volo.Abp.Identity.Web/Localization/Resources/AbpIdentity/en.json * https://github.com/abpframework/abp/tree/master/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Localization/Resources/AbpPermissionManagement/en.json -* https://github.com/abpframework/abp/tree/master/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Localization/Resources/AbpTenantManagement/Web/en.json +* https://github.com/abpframework/abp/tree/master/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Localization/Resources/AbpSettingManagement/en.json * https://github.com/abpframework/abp/tree/master/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/Localization/ApplicationContracts/en.json -* https://github.com/abpframework/abp/tree/master/templates/mvc/src/MyCompanyName.MyProjectName.Domain/Localization/MyProjectName/en.json -* https://github.com/abpframework/abp/tree/master/templates/module/src/MyCompanyName.MyProjectName.Domain/MyCompanyName/MyProjectName/Localization/Domain/en.json -* https://github.com/abpframework/abp/tree/master/templates/module/src/MyCompanyName.MyProjectName.Web/Localization/Resources/MyProjectName/en.json \ No newline at end of file +* https://github.com/abpframework/abp/tree/master/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Localization/Resources/AbpTenantManagement/Web/en.json +* https://github.com/abpframework/abp/tree/master/samples/BookStore/src/Acme.BookStore.Domain.Shared/Localization/BookStore/en.json +* https://github.com/abpframework/abp/tree/master/samples/DashboardDemo/src/DashboardDemo.Domain/Localization/DashboardDemo/en.json +* https://github.com/abpframework/abp/tree/master/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application.Contracts/ProductManagement/Localization/ApplicationContracts/en.json +* https://github.com/abpframework/abp/tree/master/samples/MicroserviceDemo/modules/product/src/ProductManagement.Domain/ProductManagement/Localization/Domain/en.json +* https://github.com/abpframework/abp/tree/master/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/Localization/Resources/ProductManagement/en.json +* https://github.com/abpframework/abp/tree/master/templates/mvc-module/src/MyCompanyName.MyProjectName.Application.Contracts/Localization/MyProjectName/ApplicationContracts/en.json +* https://github.com/abpframework/abp/tree/master/templates/mvc-module/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/DomainShared/en.json +* https://github.com/abpframework/abp/tree/master/templates/mvc-module/src/MyCompanyName.MyProjectName.Web/Localization/MyProjectName/Web/en.json +* https://github.com/abpframework/abp/tree/master/templates/mvc/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/en.json From b761cac3d254b7190784138eabba255158613b6b Mon Sep 17 00:00:00 2001 From: lonwern Date: Wed, 5 Jun 2019 15:40:59 +0800 Subject: [PATCH 3/6] Typo fix. --- docs/en/Startup-Templates/Mvc.md | 2 +- docs/zh-Hans/Startup-Templates/Mvc.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/Startup-Templates/Mvc.md b/docs/en/Startup-Templates/Mvc.md index 531b254be8..c131dffac7 100644 --- a/docs/en/Startup-Templates/Mvc.md +++ b/docs/en/Startup-Templates/Mvc.md @@ -140,7 +140,7 @@ This is a project that defines C# client proxies to use the HTTP APIs of the sol `.HttpApi.Client.ConsoleTestApp` project is a console application created to demonstrate the usage of the client proxies. -Most of time you don't need to manually create C# client proxies, thanks to ABP's [Cynamic C# API Clients](../AspNetCore/Dynamic-CSharp-API-Clients.md) feature. +Most of time you don't need to manually create C# client proxies, thanks to ABP's [Dynamic C# API Clients](../AspNetCore/Dynamic-CSharp-API-Clients.md) feature. * Depends on the `.Application.Contracts` project to be able to share the same application service interfaces and DTOs with the remote service. diff --git a/docs/zh-Hans/Startup-Templates/Mvc.md b/docs/zh-Hans/Startup-Templates/Mvc.md index 4dd28edeab..25930cf733 100644 --- a/docs/zh-Hans/Startup-Templates/Mvc.md +++ b/docs/zh-Hans/Startup-Templates/Mvc.md @@ -50,7 +50,7 @@ abp new Acme.BookStore --tiered ![bookstore-visual-studio-solution-v3](../images/bookstore-visual-studio-solution-v3.png) -项目组织在`src`和`test`文件夹中. `src`文件夹包含实际应用程序,该应用程序基于前面提到的[DDD]原则(../Domain-Driven-Design.md)进行分层. +项目组织在`src`和`test`文件夹中. `src`文件夹包含实际应用程序,该应用程序基于前面提到的[DDD](../Domain-Driven-Design.md)原则进行分层. -------------------- From 6ad283019ca5d0c3f7186baa9566d1fbd16a735b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 5 Jun 2019 23:17:23 +0300 Subject: [PATCH 4/6] added project dependencies diagram and enhanced the MVC template document. --- docs/en/Startup-Templates/Mvc.md | 86 ++++++++++-------- .../images/layered-project-dependencies.png | Bin 0 -> 32007 bytes 2 files changed, 49 insertions(+), 37 deletions(-) create mode 100644 docs/en/images/layered-project-dependencies.png diff --git a/docs/en/Startup-Templates/Mvc.md b/docs/en/Startup-Templates/Mvc.md index b44105a4f6..38c6a8750b 100644 --- a/docs/en/Startup-Templates/Mvc.md +++ b/docs/en/Startup-Templates/Mvc.md @@ -8,26 +8,32 @@ This template provides a layered (or tiered, based on the preference) applicatio You can use the [ABP CLI](../CLI.md) to create a new project using this startup template. Alternatively, you can directly create & download from the [Get Started](https://abp.io/get-started) page. CLI approach is used here. -First, install the ABP CLI as described in [its document](../CLI.md). Then use the `abp new` command in an empty folder to create a new solution: +First, install the ABP CLI if you haven't installed before: + +````bash +dotnet tool install -g Volo.Abp.Cli +```` + +Then use the `abp new` command in an empty folder to create a new solution: ````bash abp new Acme.BookStore -t mvc ```` -* `Acme.BookStore` is the solution name, like *YourCompany.YourProduct*. See the [CLI document](../CLI.md) for different naming styles. -* This example specified the template name (`-t` or `--template` option). However, `mvc` is the default template and used even if you don't specify it. +* `Acme.BookStore` is the solution name, like *YourCompany.YourProduct*. You can use single level, two-levels or three-levels naming. +* This example specified the template name (`-t` or `--template` option). However, `mvc` is already the default template if you don't specify it. -### Specify Database Provider +### Specify the Database Provider This template supports the following database providers: - `ef`: Entity Framework Core (default) - `mongodb`: MongoDB -Use the `-d` (or `--database-provider`) to specify the database provider: +Use `-d` (or `--database-provider`) option to specify the database provider: ````bash -abp new Acme.BookStore -t mvc -d mongodb +abp new Acme.BookStore -d mongodb ```` ### Create a Tiered Solution @@ -50,41 +56,37 @@ If you don't specify any option, you will have a solution like shown below: ![bookstore-visual-studio-solution-v3](../images/bookstore-visual-studio-solution-v3.png) -Projects are organized in `src` and `test` folders. `src` folder contains the actual application which is layered based on [DDD](../Domain-Driven-Design.md) principles as mentioned before. +Projects are organized in `src` and `test` folders. `src` folder contains the actual application which is layered based on [DDD](../Domain-Driven-Design.md) principles as mentioned before. The diagram below shows the layers & project dependencies of the solution: --------------------- +![layered-project-dependencies](D:\Github\abp\docs\en\images\layered-project-dependencies.png) -**TODO: Add a graphic to illustrate dependencies between projects.** +Each section below will explain the related project & its dependencies. ------------------- - -Each section below will explain the related project. +#### .Domain.Shared Project -#### .Domain Project +This project contains constants, enums and other objects these are actually a part of the domain layer, but needed to be used by all layers/projects in the solution. -This is the domain layer of the solution. It mainly contains [entities, aggregate roots](../Entities.md), [domain services](../Domain-Services.md), [value types](../Value-Types.md), [repository interfaces](../Repositories.md) and other domain objects of the solution. +A `BookType` enum and a `BookConts` class (which may have some constant fields for the `Book` entity, like `MaxNameLength`) are good candidates for this project. -A `Book` entity and a `IBookRepository` interface are good candidates for this project. +* This project has no dependency to other projects in the solution. All other projects depend on this directly or indirectly. -* Depends on the `.Domain.Shared` because it uses constants, enums and other objects defined in that project. +#### .Domain Project -#### .Domain.Shared Project +This is the domain layer of the solution. It mainly contains [entities, aggregate roots](../Entities.md), [domain services](../Domain-Services.md), [value types](../Value-Types.md), [repository interfaces](../Repositories.md) and other domain objects. -This project contains constants, enums and other objects these are actually a part of the domain layer, but needed to be used by all layers/projects in the solution. +A `Book` entity, a `BookManager` domain service and a `IBookRepository` interface are good candidates for this project. -A `BookType` enum and a `BookConts` class (which may have some constant fields for the `Book` entity, like `MaxNameLength`) are good candidates for this project. - -This project has no dependency to other projects in the solution. +* Depends on the `.Domain.Shared` because it uses constants, enums and other objects defined in that project. #### .Application.Contracts Project This project mainly contains [application service](../Application-Services.md) **interfaces** and [Data Transfer Objects](../Data-Transfer-Objects.md) (DTO) of the application layer. It does exists to separate interface & implementation of the application layer. In this way, the interface project can be shared to the clients as a contract package. -* Depends on the `.Domain.Shared` because it may use constants, enums and other shared objects in the application service interfaces and DTOs. +* Depends on the `.Domain.Shared` because it may use constants, enums and other shared objects of this project in the application service interfaces and DTOs. #### .Application Project -This project contains the [application service](../Application-Services.md) implementations of the interfaces defined in the `.Application.Contracts` project. +This project contains the [application service](../Application-Services.md) **implementations** of the interfaces defined in the `.Application.Contracts` project. * Depends on the `.Application.Contracts` project to be able to implement the interfaces and use the DTOs. * Depends on the `.Domain` project to be able to use domain objects (entities, repository interfaces... etc.) to perform the application logic. @@ -95,13 +97,13 @@ This is the integration project for the EF Core. It defines the `DbContext` and * Depends on the `.Domain` project to be able to reference to entities and repository interfaces. -> This project is available only if you are using EF Core as the database provider. +> This project is available only if you are using EF Core as the database provider. If you select another database provider, its name will be different. #### .EntityFrameworkCore.DbMigrations Project -Contains EF Cor database migrations for the solution. It has a separated `DbContext` to dedicated to manage migrations. +Contains EF Core database migrations for the solution. It has a separated `DbContext` to dedicated to manage migrations. -ABP is a modular framework and with an ideal design, each module has its own `DbContext` class. This is where the migration `DbContext` comes into play and unifies all `DbContext` configurations into a single model to maintain a single database schema. +ABP is a modular framework and with an ideal design, each module has its own `DbContext` class. This is where the migration `DbContext` comes into play and unifies all `DbContext` configurations into a single model to maintain a single database schema. For more advanced scenarios, you can have multiple databases (each contains a single or a few module tables) and multiple migration `DbContext`s (each maintains a different database schema). Notice that the migration `DbContext` is only used for database migrations and *not used on runtime*. @@ -111,20 +113,20 @@ Notice that the migration `DbContext` is only used for database migrations and * #### .DbMigrator Project -This is a console application which simplifies to execute database migrations on development and production environments. When you this application; +This is a console application which simplifies to execute database migrations on development and production environments. When you run this application, it; * Creates the database if necessary. -* Applies database migrations. -* Seeds initial data. +* Applies the pending database migrations. +* Seeds initial data if needed. -> This project has its own `appsettings.json` file. So, if you want to change the database connection string, remember to change this file. +> This project has its own `appsettings.json` file. So, if you want to change the database connection string, remember to change this file too. Especially, seeding initial data is important at this point. ABP has a modular data seed infrastructure. See [its documentation](../Data-Seeding.md) for more about the data seeding. While creating database & applying migrations seems only necessary for relational databases, this projects comes even if you choose a NoSQL database provider (like MongoDB). In that case, it still seeds initial data which is necessary for the application. * Depends on the `.EntityFrameworkCore.DbMigrations` project (for EF Core) since it needs to access to the migrations. -* Depends on the `.Application.Contracts` project to be able to access permission definitions, because initial data seeder grants permissions for the admin user. +* Depends on the `.Application.Contracts` project to be able to access permission definitions, because initial data seeder grants all permissions for the admin role by default. #### .HttpApi Project @@ -136,27 +138,29 @@ Most of time you don't need to manually define API Controllers since ABP's [Auto #### .HttpApi.Client Project -This is a project that defines C# client proxies to use the HTTP APIs of the solution. You can share this library to 3rd-party clients, so they can easily consume your HTTP APIs in their Dotnet applications. - -`.HttpApi.Client.ConsoleTestApp` project is a console application created to demonstrate the usage of the client proxies. +This is a project that defines C# client proxies to use the HTTP APIs of the solution. You can share this library to 3rd-party clients, so they can easily consume your HTTP APIs in their Dotnet applications (For other type of applications, they can still use your APIs, either manually or using a tool in their own platform) Most of time you don't need to manually create C# client proxies, thanks to ABP's [Cynamic C# API Clients](../AspNetCore/Dynamic-CSharp-API-Clients.md) feature. +`.HttpApi.Client.ConsoleTestApp` project is a console application created to demonstrate the usage of the client proxies. + * Depends on the `.Application.Contracts` project to be able to share the same application service interfaces and DTOs with the remote service. +> You can delete this project & dependencies if you don't need to create C# client proxies for your APIs. + #### .Web Project -This project contains the User Interface (UI) of the application. It contains razor pages, javascript files, css files, images and so on... +This project contains the User Interface (UI) of the application. It contains razor pages, JavaScript files, style files, images and so on... * Depends on the `.HttpApi` since UI layer needs to use APIs and application service interfaces of the solution. > If you check the source code of the `.Web.csproj` file, you will see the references to the `.Application` and the `.EntityFrameworkCore.DbMigrations` projects. > -> These references are actually not needed on development, because UI layer normally doesn't depend on the EF Core or the Application implementation. This startup templates are ready for the tiered deployment, where API layer is hosted in a separate server than the UI layer. +> These references are actually not needed while coding your UI layer, because UI layer normally doesn't depend on the EF Core or the Application layer's implementation. This startup templates are ready for the tiered deployment, where API layer is hosted in a separate server than the UI layer. > > However, if you don't choose the `--tiered` option, these references will be in the .Web project to be able to host the Web, API and application layers in a single application endpoint. > -> This gives you to ability to use domain entities in your presentation layer. However, this is considered as a bad practice according to the DDD. +> This gives you to ability to use domain entities & repositories in your presentation layer. However, this is considered as a bad practice according to the DDD. #### Test Projects @@ -170,6 +174,14 @@ The solution has multiple test projects, one for each layer: In addition, `.HttpApi.Client.ConsoleTestApp` is a console application (not an automated test project) which demonstrate the usage of HTTP APIs from a Dotnet application. +Test projects are prepared integration testing; + +* It is fully integrated to ABP framework and all services in your application. +* It uses SQLite in-memory database for EF Core. For MongoDB, it uses the [Mongo2Go](https://github.com/Mongo2Go/Mongo2Go) library. +* Authorization is disabled, so any application service can be easily used in tests. + +You can still create unit tests for your classes which will be harder to write (because you will need to prepare mock/fake objects), but faster to run (because it only tests a single class and skips all initialization process). + ### Tiered Structure TODO diff --git a/docs/en/images/layered-project-dependencies.png b/docs/en/images/layered-project-dependencies.png new file mode 100644 index 0000000000000000000000000000000000000000..c5fd1b3504056d8f75d5cf76b8871cc48a4e3740 GIT binary patch literal 32007 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 Date: Wed, 5 Jun 2019 23:18:33 +0300 Subject: [PATCH 5/6] Fix image path --- docs/en/Startup-Templates/Mvc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Startup-Templates/Mvc.md b/docs/en/Startup-Templates/Mvc.md index 0454c38486..642c0110ad 100644 --- a/docs/en/Startup-Templates/Mvc.md +++ b/docs/en/Startup-Templates/Mvc.md @@ -58,7 +58,7 @@ If you don't specify any option, you will have a solution like shown below: Projects are organized in `src` and `test` folders. `src` folder contains the actual application which is layered based on [DDD](../Domain-Driven-Design.md) principles as mentioned before. The diagram below shows the layers & project dependencies of the solution: -![layered-project-dependencies](D:\Github\abp\docs\en\images\layered-project-dependencies.png) +![layered-project-dependencies](../images/layered-project-dependencies.png) Each section below will explain the related project & its dependencies. From 1ad4261b28315726d95bb7724dfc6df5ffa5979f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 6 Jun 2019 00:47:26 +0300 Subject: [PATCH 6/6] Added tiered solution strcture section. --- ...Getting-Started-AspNetCore-MVC-Template.md | 2 +- docs/en/Startup-Templates/Mvc.md | 68 ++++++++++++++++-- ...ookstore-visual-studio-solution-tiered.png | Bin 0 -> 20089 bytes .../images/tiered-solution-applications.png | Bin 0 -> 14346 bytes docs/en/images/tiered-solution-servers.png | Bin 0 -> 33557 bytes 5 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 docs/en/images/bookstore-visual-studio-solution-tiered.png create mode 100644 docs/en/images/tiered-solution-applications.png create mode 100644 docs/en/images/tiered-solution-servers.png diff --git a/docs/en/Getting-Started-AspNetCore-MVC-Template.md b/docs/en/Getting-Started-AspNetCore-MVC-Template.md index 152452cccb..1e643b18cf 100644 --- a/docs/en/Getting-Started-AspNetCore-MVC-Template.md +++ b/docs/en/Getting-Started-AspNetCore-MVC-Template.md @@ -1,4 +1,4 @@ -## ASP.NET Core MVC Template +## Getting Started With the ASP.NET Core MVC Template This tutorials explains how to create a new ASP.NET Core MVC web application using the startup template, configure and run it. diff --git a/docs/en/Startup-Templates/Mvc.md b/docs/en/Startup-Templates/Mvc.md index 642c0110ad..6916a630a3 100644 --- a/docs/en/Startup-Templates/Mvc.md +++ b/docs/en/Startup-Templates/Mvc.md @@ -4,7 +4,12 @@ This template provides a layered (or tiered, based on the preference) application structure based on the [Domain Driven Design](../Domain-Driven-Design.md) (DDD) practices. -## How to Start With +This document explains the solution structure and projects in details. + +* See [Getting Started With the ASP.NET Core MVC Template](../Getting-Started-AspNetCore-MVC-Template.md) to create a new solution and run it for this template. +* See the [ASP.NET Core MVC Tutorial](../Tutorials/AspNetCore-Mvc/Part-I.md) to learn how to develop applications using this template. + +## How to Start With? You can use the [ABP CLI](../CLI.md) to create a new project using this startup template. Alternatively, you can directly create & download from the [Get Started](https://abp.io/get-started) page. CLI approach is used here. @@ -152,6 +157,8 @@ Most of time you don't need to manually create C# client proxies, thanks to ABP' This project contains the User Interface (UI) of the application. It contains razor pages, JavaScript files, style files, images and so on... +This project contains the main `appsettings.json` file that contains the connection string and other configuration of the application. + * Depends on the `.HttpApi` since UI layer needs to use APIs and application service interfaces of the solution. > If you check the source code of the `.Web.csproj` file, you will see the references to the `.Application` and the `.EntityFrameworkCore.DbMigrations` projects. @@ -182,14 +189,63 @@ Test projects are prepared integration testing; You can still create unit tests for your classes which will be harder to write (because you will need to prepare mock/fake objects), but faster to run (because it only tests a single class and skips all initialization process). +#### How to Run? + +Set `.Web` as the startup project and run the application. Default username is `admin` and password is `1q2w3E*`. + +See [Getting Started With the ASP.NET Core MVC Template](../Getting-Started-AspNetCore-MVC-Template.md) for more information. + ### Tiered Structure -TODO +If you specify the `--tiered` option as described above, the solution created will be a tiered solution. The purpose of the tiered structure is to be able to **deploy Web application and HTTP API to different servers**: + +![bookstore-visual-studio-solution-v3](../images/tiered-solution-servers.png) + +* Browser runs your UI by executing HTML, CSS & JavaScript. +* Web servers hosts static UI files (CSS, JavaScript, image... etc.) & dynamic components (e.g. Razor pages). It performs HTTP requests to the API server to execute the business logic of the application. +* API Server hosts the HTTP APIs which then use application & domain layers of the application to perform the business logic. +* Finally, database server hosts your database. + +So, the resulting solution allows a 4-tiered deployment, by comparing to 3-tiered deployment of the default structure explained before. + +> Unless you actually need to such a 4-tiered deployment, its suggested to go with the default structure which is simpler to develop, deploy and maintain. + +The solution structure is shown below: + +![bookstore-visual-studio-solution-v3](../images/bookstore-visual-studio-solution-tiered.png) + +As different from the default structure, two new projects come into play: `.IdentityServer` & `.HttpApi.Host`. + +#### .IdentityServer Project + +This project is used as an authentication server for other projects. `.Web` project uses OpenId Connect Authentication to get identity and access tokens for the current user. Then uses the access token to call the HTTP API server. HTTP API server uses bearer token authentication to obtain claims from the access token to authorize the current user. + +![bookstore-visual-studio-solution-v3](../images/tiered-solution-applications.png) + +ABP uses the open source [IdentityServer4](https://identityserver.io/) framework for the authentication between applications. See [IdentityServer4 documentation](http://docs.identityserver.io) for details about the IdentityServer4 and OpenID Connect protocol. + +It has its own `appsettings.json` that contains database connection and other configurations. + +#### .HttpApi.Host Project + +This project is an application that hosts the API of the solution. + +It has its own `appsettings.json` that contains database connection and other configurations. + +#### .Web Project + +Just like the default structure, this project contains the User Interface (UI) of the application. It contains razor pages, JavaScript files, style files, images and so on... + +This project contains an `appsettings.json` file, but this time it does not have a connection string because it never connects to the database. Instead, it mainly contains endpoint of the remote API server and the authentication server. + +#### Pre-requirements -### Other Database Providers +* [Redis](https://redis.io/): The applications use Redis as as distributed cache. So, you need to have Redis installed & running. -TODO +#### How to Run? -#### MongoDB +You should run the application with the given order: -TODO \ No newline at end of file +* First, run the `.IdentityServer` since other applications depends on it. +* Then run the `.HttpApi.Server` since it is used by the `.Web` application. +* Finally, you can run the `.Web` project and login to the application (using `admin` as the username and `1q2w3E*` as the password). \ No newline at end of file diff --git a/docs/en/images/bookstore-visual-studio-solution-tiered.png b/docs/en/images/bookstore-visual-studio-solution-tiered.png new file mode 100644 index 0000000000000000000000000000000000000000..19662bf73179537bfb2afc7b34c01aa98f7b902e GIT binary patch literal 20089 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 f|6ksJXGCHQb+7^Ho8MZ77nz6}s3HoF>`! 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

PF8k%_NUV-p5-YnBNJX641P;n#(EP+_|0nP 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 literal 0 HcmV?d00001 diff --git a/docs/en/images/tiered-solution-servers.png b/docs/en/images/tiered-solution-servers.png new file mode 100644 index 0000000000000000000000000000000000000000..3c999b4b45475ce88992ea49bf1fb8338ba17617 GIT binary patch literal 33557 zcmdSA1yI}H_b5n(wn&R>(cs11p@rb~#ogVDyA;>pZY^58!JQWO6qg`{0KqM|Zuqad(XY++~enbqW@8rd5cbpj)H>nR!$bEhJx~<5e4Ph=$q%r zJDG8ew+qGnnkX*P8X&2>%0 zSsl5Gb&FdSCs`h*Tk#ZKVdVQ*wQ{@BuI%6Ca~HUQOsxKH1_cEGNG^B!_tVdpA^w?Zrm(1O;x~>5Q3jdCis^$-@Ay ztmO<|mn+#Kok8Mt9xPbZTG7DuFx+4aD9?e%43Mgd%8HV@w>o$<;%DkA`O{a_*<@-q z+pbXrPlgdaJb10X5QV6X#SB?^1_g+NNQ2$KAnByh*?oVw`+{3(nrD25&jDCCX@jJM ziYA@>2U8JD*BRn+$3@vc-=E3S3=N_%{hoeHc;~rLS7pPKy(b<2v8qv267-womE7-R z)s(b7t+$j&xI9P!Omv8@wa+rQ_MPUTNs_IA@;*uXmJj}o-WPlYsbPx@2DzXu=scj3-%rX!L#XI-totEOA_56E8R?%MWLjiQjC z{XGJ_e~&CwQSRBnNNvEMGp7#0A+;0nsLjp&zrdC zpzMa=2a+jr#Ax4qLBsW2!2`_p@ z6;DO^;;*pL{=aqI`KvH-R4pwnD{@d0<^Q{Oc{KmKZ1Bs?|LHXo`(M;6)K<`gQ-4vT zWWBuOE*Acu&--76|9@|sD3ULz02NhLiXM0*!8-bC*>Msiup*NTP6|{pHi|;;)9V{Xjy!n1h14uoXfiO?e_7 z&4V$)yN5slqjoi?7EMKV3qU_m5t!T3VWTxdiiU#1aY{}3!Xmqoxlvry4tw#`WUOx` zW9Ci>NsIH>7X&CIW>zlupSvz`$>x!_iXst=A0t{EOz-!J_i!ZAW2YrhgPdl4;dd2~0O*pNMmoWuJScj?kaDv~TU}S~ zKil~AFAz$nxWFUmdVY?|qtl-c7*$wEYs^IlS&PD``iHgQg!fSVZyrt4+>A4?7&Uhgq_G*Z%GQ$Q4j#6Ct)cSPs33=Cq z>U%Bnf`TIZ@rm0T;4wDvgav1E+so!yRZkb2BIiK1fa6j3;rr|HP=@4Xp1-L4)t0t3oyAYETlU&$V?oV=jsYYcipl>=kp4^1 zV$S*M1p)=0b_Cnk-sb!82GTJw3$ljb{QNKJ3&wO=?C~CV@nBuMRG9;FM{5=*QR<*OOO%hr^^>eOo%8qc{T@-el1gL%Sw&v%9D_#8hr$Y)Q3Z>v`%Q zUM>A0O87lqnY=*tm+QlB(SzgaiY1(aMi5i&mjm;M|4>^FdSH3aT^0tc4m*rtIfG0r=h(=?vYg#VYjo(y1sB> zpZ@-;%1s;*bCY%~6LDct%Dy57a{PPJ_DD{YRXF@KyDu~ngIst36REoOvURJj+StnH zZ>J=CZl{p@2>lp<`cbd#&^HKFP*E{HB6yar`6>zdeg0fxk4;z$sCoK?Q) znWfRK${S|~ZvBHN21phUH;�r2%IjP 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 literal 0 HcmV?d00001