From 459a50fe8e179f771583ca97eec39c4e41033d5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 3 Jun 2019 13:24:17 +0300 Subject: [PATCH] Update Part-I of the MVC tutorial based on the latest startup template. --- docs/en/Tutorials/AspNetCore-Mvc/Part-I.md | 126 +++++++++++------- .../images/bookstore-add-index-page-v2.png | Bin 0 -> 8081 bytes .../images/bookstore-add-index-page.png | Bin 8699 -> 0 bytes .../bookstore-localization-files-v2.png | Bin 0 -> 6323 bytes .../images/bookstore-localization-files.png | Bin 5416 -> 0 bytes .../bookstore-visual-studio-solution-v2.png | Bin 8946 -> 0 bytes .../bookstore-visual-studio-solution-v3.png | Bin 0 -> 12919 bytes .../bookstore-visual-studio-solution.png | Bin 7369 -> 0 bytes 8 files changed, 75 insertions(+), 51 deletions(-) create mode 100644 docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-add-index-page-v2.png delete mode 100644 docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-add-index-page.png create mode 100644 docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-localization-files-v2.png delete mode 100644 docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-localization-files.png delete mode 100644 docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-visual-studio-solution-v2.png create mode 100644 docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-visual-studio-solution-v3.png delete mode 100644 docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-visual-studio-solution.png diff --git a/docs/en/Tutorials/AspNetCore-Mvc/Part-I.md b/docs/en/Tutorials/AspNetCore-Mvc/Part-I.md index c30657ddd4..a3d1c29550 100644 --- a/docs/en/Tutorials/AspNetCore-Mvc/Part-I.md +++ b/docs/en/Tutorials/AspNetCore-Mvc/Part-I.md @@ -2,7 +2,7 @@ ### About this Tutorial -In this tutorial series, you will build an application that is used to manage a list of books & their authors. **Entity Framework Core** (EF Core) will be used as the ORM provider (as it comes pre-configured with the [startup template](https://abp.io/Templates)). +In this tutorial series, you will build an application that is used to manage a list of books & their authors. **Entity Framework Core** (EF Core) will be used as the ORM provider as it is the default database provider. This is the first part of the tutorial series. See all parts: @@ -10,35 +10,37 @@ This is the first part of the tutorial series. See all parts: - [Part II: Create, Update and Delete books](Part-II.md) - [Part III: Integration Tests](Part-III.md) -You can download the **source code** of the application [from here](https://github.com/volosoft/abp/tree/master/samples/BookStore). +You can access to the **source code** of the application from [the GitHub repository](https://github.com/volosoft/abp/tree/master/samples/BookStore). ### Creating the Project -Go to the [startup template page](https://abp.io/Templates) and download a new project named `Acme.BookStore`, create the database and run the application by following the [template document](../../Getting-Started-AspNetCore-MVC-Template.md). +Create a new project named `Acme.BookStore`, create the database and run the application by following the [Getting Started document](../../Getting-Started-AspNetCore-MVC-Template.md). ### Solution Structure -This is the how the layered solution structure looks after it's created from the startup template: +This is how the layered solution structure looks after it's created: ![bookstore-visual-studio-solution](images/bookstore-visual-studio-solution-v3.png) +> You can see [MVC application template document](../../Startup-Templates/Mvc.md) to understand the solution structure in details. However, you will understand the basics with this tutorial. + ### Create the Book Entity -Define [entities](../../Entities.md) in the **domain layer** (`Acme.BookStore.Domain` project) of the solution. The main entity of the application is the `Book`: +Domain layer in the startup template is separated into two projects: + +- `Acme.BookStore.Domain` contains your [entities](../../Entities.md), [domain services](../../Domain-Services.md) and other core domain objects. +- `Acme.BookStore.Domain.Shared` contains constants, enums or other domain related objects those can be shared with clients. + +Define [entities](../../Entities.md) in the **domain layer** (`Acme.BookStore.Domain` project) of the solution. The main entity of the application is the `Book`. Create a class, named `Book`, in the `Acme.BookStore.Domain` project as shown below: ````C# using System; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; using Volo.Abp.Domain.Entities.Auditing; namespace Acme.BookStore { - [Table("Books")] public class Book : AuditedAggregateRoot { - [Required] - [StringLength(128)] public string Name { get; set; } public BookType Type { get; set; } @@ -50,14 +52,14 @@ namespace Acme.BookStore } ```` -* ABP has two fundamental base classes for entities: `AggregateRoot` and `Entity`. **Aggregate Root** is one of the **Domain Driven Design (DDD)** concepts. See [entity document](../../Entities.md) for more details and best practices. +* ABP has two fundamental base classes for entities: `AggregateRoot` and `Entity`. **Aggregate Root** is one of the **Domain Driven Design (DDD)** concepts. See [entity document](../../Entities.md) for details and best practices. * `Book` entity inherits `AuditedAggregateRoot` which adds some auditing properties (`CreationTime`, `CreatorId`, `LastModificationTime`... etc.) on top of the `AggregateRoot` class. * `Guid` is the **primary key type** of the `Book` entity. * Used **data annotation attributes** in this code for EF Core mappings. Alternatively you could use EF Core's [fluent mapping API](https://docs.microsoft.com/en-us/ef/core/modeling) instead. #### BookType Enum -The `BookType` enum used above is defined as below: +Define the `BookType` enum in the `Acme.BookStore.Domain.Shared` project: ````C# namespace Acme.BookStore @@ -65,7 +67,7 @@ namespace Acme.BookStore public enum BookType : byte { Undefined, - Advanture, + Adventure, Biography, Dystopia, Fantastic, @@ -91,14 +93,15 @@ EF Core requires you to relate entities with your DbContext. The easiest way to #### Configure Your Book Entity -Open BookStoreDbContextModelCreatingExtensions.cs file from the `Acme.BookStore.EntityFrameworkCore` project, add following code to the end of ConfigureBookStore method to configure Book entity: +Open `BookStoreDbContextModelCreatingExtensions.cs` file in the `Acme.BookStore.EntityFrameworkCore` project and add following code to the end of the `ConfigureBookStore` method to configure the Book entity: ````C# - builder.Entity(b => - { - b.ToTable(BookStoreConsts.DbTablePrefix + "Books", BookStoreConsts.DbSchema); - b.ConfigureExtraProperties(); - }); +builder.Entity(b => +{ + b.ToTable(BookStoreConsts.DbTablePrefix + "Books", BookStoreConsts.DbSchema); + b.ConfigureAuditedAggregateRoot(); //auto configure for the base class props + b.Property(x => x.Name).IsRequired().HasMaxLength(128); +}); ```` #### Add New Migration & Update the Database @@ -121,20 +124,21 @@ PM> Update-Database ### Create the Application Service -The next step is to create an [application service](../../Application-Services.md) to manage (create, list, update, delete...) the books. +The next step is to create an [application service](../../Application-Services.md) to manage (create, list, update, delete...) the books. Application layer in the startup template is separated into two projects: + +* `Acme.BookStore.Application.Contracts` mainly contains your DTOs and application service interfaces. +* `Acme.BookStore.Application` contains the implementations of your application services. #### BookDto -Create a DTO class named `BookDto` into the `Acme.BookStore.Application` project: +Create a DTO class named `BookDto` into the `Acme.BookStore.Application.Contracts` project: ````C# using System; using Volo.Abp.Application.Dtos; -using Volo.Abp.AutoMapper; namespace Acme.BookStore { - [AutoMapFrom(typeof(Book))] public class BookDto : AuditedEntityDto { public string Name { get; set; } @@ -151,20 +155,34 @@ namespace Acme.BookStore * **DTO** classes are used to **transfer data** between the *presentation layer* and the *application layer*. See the [Data Transfer Objects document](../../Data-Transfer-Objects.md) for more details. * `BookDto` is used to transfer book data to the presentation layer in order to show the book information on the UI. * `BookDto` is derived from the `AuditedEntityDto` which has audit properties just like the `Book` class defined above. -* `[AutoMapFrom(typeof(Book))]` is used to create AutoMapper mapping from the `Book` class to the `BookDto` class. In this way, you get automatic conversion of `Book` objects to `BookDto` objects (instead of manually copy all properties). + +It will be needed to convert `Book` entities to `BookDto` objects while returning books to the presentation layer. [AutoMapper](https://automapper.org) library can automate this conversion when you define the proper mapping. Startup template comes with AutoMapper configured, so you can just define the mapping in the `BookStoreApplicationAutoMapperProfile` class in the `Acme.BookStore.Application` project: + +````csharp +using AutoMapper; + +namespace Acme.BookStore +{ + public class BookStoreApplicationAutoMapperProfile : Profile + { + public BookStoreApplicationAutoMapperProfile() + { + CreateMap(); + } + } +} +```` #### CreateUpdateBookDto -Create a DTO class named `CreateUpdateBookDto` into the `Acme.BookStore.Application` project: +Create a DTO class named `CreateUpdateBookDto` into the `Acme.BookStore.Application.Contracts` project: ````c# using System; using System.ComponentModel.DataAnnotations; -using Volo.Abp.AutoMapper; namespace Acme.BookStore { - [AutoMapTo(typeof(Book))] public class CreateUpdateBookDto { [Required] @@ -184,11 +202,17 @@ namespace Acme.BookStore ```` * This DTO class is used to get book information from the user interface while creating or updating a book. -* It defines data annotation attributes (like `[Required]`) to define validations for the properties. DTOs are automatically validated by ABP. +* It defines data annotation attributes (like `[Required]`) to define validations for the properties. DTOs are [automatically validated](../../Validation.md) by the ABP framework. + +Like done for the `BookDto` above, create a mapping from the `CreateUpdateBookDto` object to the `Book` entity: + +````csharp +CreateMap(); +```` #### IBookAppService -Define an interface named `IBookAppService` for the book application service: +Define an interface named `IBookAppService` in the `Acme.BookStore.Application.Contracts` project: ````C# using System; @@ -210,13 +234,13 @@ namespace Acme.BookStore } ```` -* Defining interfaces for application services is not required by the framework. However, it's suggested as best practice. -* `IAsyncCrudAppService` defines common **CRUD** methods: `GetAsync`, `GetListAsync`, `CreateAsync`, `UpdateAsync` and `DeleteAsync`. It's not required to extend it. Instead, you could inherit from the empty `IApplicationService` interface and define your own methods. -* There are some variations of the `IAsyncCrudAppService` where you can use a single DTO or separated DTOs for each method. +* Defining interfaces for application services is not required by the framework. However, it's suggested as a best practice. +* `IAsyncCrudAppService` defines common **CRUD** methods: `GetAsync`, `GetListAsync`, `CreateAsync`, `UpdateAsync` and `DeleteAsync`. It's not required to extend it. Instead, you could inherit from the empty `IApplicationService` interface and define your own methods manually. +* There are some variations of the `IAsyncCrudAppService` where you can use separated DTOs for each method. #### BookAppService -Implement the `IBookAppService` as named `BookAppService`: +Implement the `IBookAppService` as named `BookAppService` in the `Acme.BookStore.Application` project: ````C# using System; @@ -241,23 +265,23 @@ namespace Acme.BookStore ```` * `BookAppService` is derived from `AsyncCrudAppService<...>` which implements all the CRUD methods defined above. -* `BookAppService` injects `IRepository` which is the default repository created for the `Book` entity. ABP automatically creates repositories for each aggregate root (or entity). See the [repository document](../../Repositories.md). -* `BookAppService` uses `IObjectMapper` to convert `Book` objects to `BookDto` objects and `CreateUpdateBookDto` objects to `Book` objects. The Startup template uses the [AutoMapper](http://automapper.org/) library as object mapping provider. You defined mappings using the `AutoMapFrom` and the `AutoMapTo` attributes above. See the [AutoMapper integration document](../../AutoMapper-Integration.md) for details. +* `BookAppService` injects `IRepository` which is the default repository for the `Book` entity. ABP automatically creates default repositories for each aggregate root (or entity). See the [repository document](../../Repositories.md). +* `BookAppService` uses `IObjectMapper` to convert `Book` objects to `BookDto` objects and `CreateUpdateBookDto` objects to `Book` objects. The Startup template uses the [AutoMapper](http://automapper.org/) library as the object mapping provider. You defined the mappings before, so it will work as expected. ### Auto API Controllers -You normally create **Controllers** to expose application services as **HTTP API** endpoints. Thus allowing browser or 3rd-party clients to call them via AJAX. - -ABP can [**automagically**](../../AspNetCore/Auto-API-Controllers.md) configures your application services as MVC API Controllers by convention. +You normally create **Controllers** to expose application services as **HTTP API** endpoints. Thus allowing browser or 3rd-party clients to call them via AJAX. ABP can [**automagically**](../../AspNetCore/Auto-API-Controllers.md) configures your application services as MVC API Controllers by convention. #### Swagger UI -The startup template is configured to run the [swagger UI](https://swagger.io/tools/swagger-ui/) using the [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) library. Run the application and enter `http://localhost:53929/swagger/` as URL on your browser. +The startup template is configured to run the [swagger UI](https://swagger.io/tools/swagger-ui/) using the [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) library. Run the application and enter `https://localhost:XXXX/swagger/` (replace XXXX by your own port) as URL on your browser. You will see some built-in service endpoints as well as the `Book` service and its REST-style endpoints: ![bookstore-swagger](images/bookstore-swagger.png) +Swagger has a nice UI to test APIs. You can try to execute the `[GET] /api/app/book` API to get a list of books. + ### Dynamic JavaScript Proxies It's common to call HTTP API endpoints via AJAX from the **JavaScript** side. You can use `$.ajax` or another tool to call the endpoints. However, ABP offers a better way. @@ -266,7 +290,7 @@ ABP **dynamically** creates JavaScript **proxies** for all API endpoints. So, yo #### Testing in the Browser Developer Console -You can easily test the JavaScript proxy using your favorite browser's **Developer Console** now. Run the application again, open your browser's **developer tools** (shortcut: F12), switch to the **Console** tab, type the following code and press enter: +You can easily test the JavaScript proxies using your favorite browser's **Developer Console** now. Run the application, open your browser's **developer tools** (shortcut: F12), switch to the **Console** tab, type the following code and press enter: ````js acme.bookStore.book.getList({}).done(function (result) { console.log(result); }); @@ -275,7 +299,7 @@ acme.bookStore.book.getList({}).done(function (result) { console.log(result); }) * `acme.bookStore` is the namespace of the `BookAppService` converted to [camelCase](https://en.wikipedia.org/wiki/Camel_case). * `book` is the conventional name for the `BookAppService` (removed AppService postfix and converted to camelCase). * `getList` is the conventional name for the `GetListAsync` method defined in the `AsyncCrudAppService` base class (removed Async postfix and converted to camelCase). -* `{}` argument is used to send an empty object to the `GetListAsync` method which normally expects an object of type `PagedAndSortedResultRequestDto` which is used to send paging and sorting options to the server. +* `{}` argument is used to send an empty object to the `GetListAsync` method which normally expects an object of type `PagedAndSortedResultRequestDto` that is used to send paging and sorting options to the server (all properties are optional, so you can send an empty object). * `getList` function returns a `promise`. So, you can pass a callback to the `done` (or `then`) function to get the result from the server. Running this code produces the following output: @@ -298,7 +322,7 @@ You should see a message in the console something like that: successfully created the book with id: f3f03580-c1aa-d6a9-072d-39e75c69f5c7 ```` -Check the `books` table in the database to see the new book row. You can try `get`, `update` and `delete` functions too. +Check the `Books` table in the database to see the new book row. You can try `get`, `update` and `delete` functions yourself. ### Create the Books Page @@ -306,7 +330,7 @@ It's time to create something visible and usable! Instead of classic MVC, we wil Create a new `Books` folder under the `Pages` folder of the `Acme.BookStore.Web` project and add a new Razor Page named `Index.cshtml`: -![bookstore-add-index-page](images/bookstore-add-index-page.png) +![bookstore-add-index-page](images/bookstore-add-index-page-v2.png) Open the `Index.cshtml` and change the content as shown below: @@ -319,7 +343,8 @@ Open the `Index.cshtml` and change the content as shown below:

Books

```` -* Change the default inhertitance of the Razor View Page Model so it **inherits** from the `BookStorePageBase` class (instead of `PageModel`). The `BookStorePageBase` class which comes with the startup template and provides some shared properties/methods used by all pages. +* This code changes the default inheritance of the Razor View Page Model so it **inherits** from the `BookStorePageBase` class (instead of `PageModel`). The `BookStorePageBase` class which comes with the startup template and provides some shared properties/methods used by all pages. +* Ensure that the `IndexModel` (*Index.cshtml.cs)* has the `Acme.BookStore.Pages.Books` namespace, or update it in the `Index.cshtml`. #### Add Books Page to the Main Menu @@ -334,17 +359,16 @@ context.Menu.AddItem( #### Localizing the Menu Items -Localization texts are located under the `Localization/BookStore` folder of the `Acme.BookStore.Domain` project: +Localization texts are located under the `Localization/BookStore` folder of the `Acme.BookStore.Domain.Shared` project: -![bookstore-localization-files](images/bookstore-localization-files.png) +![bookstore-localization-files](images/bookstore-localization-files-v2.png) -Open the `en.json` file and add localization texts for `Menu:BookStore` and `Menu:Books` keys: +Open the `en.json` file and add localization texts for `Menu:BookStore` and `Menu:Books` keys to the end of the file: ````json { "culture": "en", "texts": { - //... "Menu:BookStore": "Book Store", "Menu:Books": "Books" } @@ -352,9 +376,9 @@ Open the `en.json` file and add localization texts for `Menu:BookStore` and `Men ```` * ABP's localization system is built on [ASP.NET Core's standard localization](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization) system and extends it in many ways. See the [localization document](../../Localization.md) for details. -* Localization key names are arbitrary, you can set any name. We prefer to add `Menu` namespace for menu items to distinguish from other texts. If a text is not defined in the localization file, it **fallbacks** to the localization key (ASP.NET Core's standard behavior). +* Localization key names are arbitrary. You can set any name. We prefer to add `Menu:` prefix for menu items to distinguish from other texts. If a text is not defined in the localization file, it **fallbacks** to the localization key (ASP.NET Core's standard behavior). -Run the application and see the menu items are added to the top bar: +Run the application and see the new menu item has been added to the top bar: ![bookstore-menu-items](images/bookstore-menu-items.png) @@ -362,7 +386,7 @@ When you click to the Books menu item, you are redirected to the new Books page. #### Book List -We will use the [Datatables.net](https://datatables.net/) JQuery plugin to show list of tables on the page. Datatables can completely work via AJAX, so it is fast and provides a good user experience. Datatables plugin is configured in the startup template, so you can directly use it in any page without including any style or script file to your page. +We will use the [Datatables.net](https://datatables.net/) JQuery plugin to show list of tables on the page. Datatables can completely work via AJAX, it is fast and provides a good user experience. Datatables plugin is configured in the startup template, so you can directly use it in any page without including any style or script file to your page. ##### Index.cshtml Changes diff --git a/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-add-index-page-v2.png b/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-add-index-page-v2.png new file mode 100644 index 0000000000000000000000000000000000000000..2606bbab32325a337116782f7194b95fb8120dfe GIT binary patch literal 8081 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 diff --git a/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-visual-studio-solution-v2.png b/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-visual-studio-solution-v2.png deleted file mode 100644 index 48b5881e96d7d55d8ac5a292183c6236a07e9f05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8946 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 literal 0 HcmV?d00001 diff --git a/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-visual-studio-solution.png b/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-visual-studio-solution.png deleted file mode 100644 index b47636cd68b8b34478e44ccee1383de06bd5ba03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7369 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