Search This Blog

Wednesday, January 8, 2020

Xây dựng CRUD sử dụng ASP.NET MVC kết nối với ElasticSearch chạy trên môi trường Docker

Tạo mới project ASP.NET MVC Core 3.1


Chọn loại project là Web Application (Model - View - Controller) -> Create.

Install packages:
- Elasticsearch.Net
- NEST


Tạo class ElasticSearchFactory để tạo client connector đến ElasticSearch
 namespace ElasticSearchClient  
 {  
   public class ElasticSearchFactory  
   {  
     public ElasticClient ElasticSearchClient()  
     {  
       var nodes = new Uri[]  
       {  
         new Uri("http://localhost:9200/"),  
       };  
       var connectionPool = new StaticConnectionPool(nodes);  
       var connectionSettings = new ConnectionSettings(connectionPool).DisableDirectStreaming();  
       var elasticClient = new ElasticClient(connectionSettings);  
       return elasticClient;  
     }  
   }  
 }  


Add new MVC controller with read/write actions, đặt tên là CatalogController.



Trong thư mục Models, tạo class Catalog.cs
 namespace ElasticSearchClient.Models  
 {  
   public class Catalog  
   {  
     public string Id { get; set; }  
     [Required]  
     public string Name { get; set; }  
     public string Description { get; set; }  
   }  
 }  


Trong CatalogController, khai báo ElasticSearchFactory
   public class CatalogController : Controller  
   {  
     private readonly ElasticSearchFactory _esFactory;  
     public CatalogController()  
     {  
       _esFactory = new ElasticSearchFactory();  
     }  


Viết đoạn code đoạn truy vấn đơn giản đến ElasticSearch trong action Index.
     // GET: Catalog  
     public async Task<ActionResult> Index()  
     {  
       return View(await DoSearchAsync());  
     }  
     private async Task<List<Catalog>> DoSearchAsync(string name = "")  
     {  
       var response = await (_esFactory.ElasticSearchClient().SearchAsync<Catalog>(s => s  
                   .Index("catalogs")  
                   .Size(50)  
                   .Query(q => q  
                     .Match(m => m  
                       .Field(f => f.Name)  
                       .Query(name)  
                     )  
                   )  
                 ));  
       return response.Hits.Select(s => s.Source).ToList();  
     }  

Tiến hành Add New View cho action Index như hình bên dưới, với:
- Template: List
- Model class: Catalog (tạo ở bước trước)



Kết quả view Index được tạo ra như hình bên dưới

Nhấn F5 để chạy chương trình, sau đó đi đến trang Catalog theo đường dẫn https://localhost:[your-port]/Catalog để xem kết quả.
Chú ý: ElasticSearch phải đang được chạy trước khi run F5. Nếu không sẽ bị báo lỗi ko có kết nối. Xem lại bài trước Cài đặt ElasticSearch với Docker để biết thêm chi tiết.


Viết code để tiến hành thêm mới dữ liệu vào ElasticSearch
     // GET: Catalog/Create  
     public ActionResult Create()  
     {  
       return View();  
     }  
     // POST: Catalog/Create  
     [HttpPost]  
     [ValidateAntiForgeryToken]  
     public ActionResult Create(Catalog catalog)  
     {  
       if (ModelState.IsValid)  
       {  
         try  
         {  
           catalog.Id = Guid.NewGuid().ToString();  
           var response = _esFactory.ElasticSearchClient().Index<Catalog>(catalog, i => i  
                       .Index("catalogs")  
                       .Id(catalog.Id)  
                       .Refresh(Elasticsearch.Net.Refresh.True));  
           return RedirectToAction(nameof(Index));  
         }  
         catch  
         {  
           return View(catalog);  
         }  
       }  
       return View(catalog);  
     }  

Tiến hành Add View cho action Create với
- Template: Create
- Model class: Catalog.



View Create.cshtml được sinh ra như hình

Run F5 và thử Create New
Kết quả sau khi thêm mới dữ liệu


Viết code tương tự cho Edit action
     // GET: Catalog/Edit/5  
     public async Task<ActionResult> Edit(string id)  
     {  
       return View(await GetByIdAsync(id));  
     }  
     private async Task<Catalog> GetByIdAsync(string id)  
     {  
       return (await _esFactory.ElasticSearchClient().GetAsync<Catalog>(id, i =>   
               i.Index("catalogs"))).Source;  
     }  
     // POST: Catalog/Edit/5  
     [HttpPost]  
     [ValidateAntiForgeryToken]  
     public async Task<ActionResult> Edit(int id, Catalog catalog)  
     {  
       if (ModelState.IsValid)  
       {  
         try  
         {  
           var response = await _esFactory.ElasticSearchClient().UpdateAsync<Catalog>(catalog, i => i  
                       .Index("catalogs")  
                       .Refresh(Elasticsearch.Net.Refresh.True));  
           return RedirectToAction(nameof(Index));  
         }  
         catch  
         {  
           return View(catalog);  
         }  
       }  
       return View(catalog);  
     }  

Viết code tương tự cho Delete action
     // GET: Catalog/Delete/5  
     public async Task<ActionResult> Delete(string id)  
     {  
       return View(await GetByIdAsync(id));  
     }  
     // POST: Catalog/Delete/5  
     [HttpPost]  
     [ValidateAntiForgeryToken]  
     public async Task<ActionResult> Delete(string id, Catalog catalog)  
     {  
       try  
       {  
         var response = await _esFactory.ElasticSearchClient().DeleteAsync<Catalog>(id, i => i  
                 .Index("catalogs")  
                 .Refresh(Elasticsearch.Net.Refresh.True));  
         return RedirectToAction(nameof(Index));  
       }  
       catch  
       {  
         return View(catalog);  
       }  
     }  

Như vậy là chúng ta vừa hoàn tất viết một CRUD đơn giản sử dụng ASP.NET MVC kết nối đến ElasticSearch chạy trong môi trường Docker.

Source code: https://github.com/chkien0911/blog_examples/tree/master/ElasticSearchClient

Bài tiếp theo chúng ta sẽ thực hiện query đến ElasticSearch.

No comments:

Post a Comment