Translate

Hiển thị các bài đăng có nhãn khởi tạo. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn khởi tạo. Hiển thị tất cả bài đăng

Thứ Bảy, 20 tháng 3, 2021

Bài 2.b: Tạo một action đơn giản

Bài 2.b: Tạo một action đơn giản

bài trước, các bạn đã thêm lớp Product vào phần mềm. Bài này, tôi sẽ hướng dẫn các bạn tạo một nút lệnh đơn giản (SimpleAction), khi chọn một product bấm vào nó hiển thị tên của sản phẩm đó. 
Đơn giản như đang giỡn, nhưng ai cũng vậy, trước khi chạy mình bò từ từ hén.

Tạo controller

Các nút lệnh tương tác trong phần mềm nền tảng XAF đều thông qua action. Lớp ViewController sẽ chứa các action đó. 
Vì vậy các bạn trước hết tạo một lớp ViewController như sau:

Đơn giản tên lớp là ProductViewController, nên đặt tên đối tượng là lớp nào để dễ maintain sau này.
Lớp này bạn nên đặt vào thư mục Inventory của lần trước. Nếu kỹ nữa thì trong thư mục này nên có thư mục Enitties dành để chứa các lớp như Product và ViewControllers để chứa các viewcontroller. Nhưng thôi ở bước này làm gọn, để tập trung vào ViewController.

Tạo Action

XAF có hỗ trợ tạo designer, các bạn thêm action vào dễ dàng. Tuy nhiên, với các project dùng .netCore framework chưa hỗ trợ desgin. Các bạn có thể tìm hiểu cách này ở tài liệu XAF và làm thử ở solution .net_Guid.
Ở đây, tôi chỉ các bạn tạo action trong code. Tất cả làm trong code hết.
Các bạn tạo đoạn code thế này.
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.Actions;
using System;
using System.Collections.Generic;
using System.Text;
using YouSoft.Vn.XAFCustom.Supports.Extensions;

namespace App.Module.Modules.Inventory
{
    
    public class ProductViewController:ViewController
    {
    	//Khai báo action
        SimpleAction _showNameAction;
        public ProductViewController()
        {
        	//ViewController này chỉ dành cho lớp Product
            TargetObjectType = typeof(Product);
            _showNameAction = new SimpleAction()
            {
            	//Id để nhận diện thôi
                Id = nameof(_showNameAction),
                //action này chỉ hoạt đột trên lớp Product
                TargetObjectType=typeof(Product),
                
                Caption = "Hiển thị tên",
                Category = "View",
                //action chỉ hoạt động khi có một sản phẩm được chọn
                SelectionDependencyType=SelectionDependencyType.RequireSingleObject
            };

            _showNameAction.Execute += _showNameAction_Execute;
            Actions.Add(_showNameAction);
        }

        private void _showNameAction_Execute(object sender, SimpleActionExecuteEventArgs e)
        {
            if(View.GetSingleObject<Product>() is Product product)
            //Nếu đối tượng được chọn khác null, một cách viêt khác cho gọn
            {
            	//hiển thị thông báo tới người dùng
                this.AlertInfo($"Tên sản phẩm:  {product.Name}");
            }
        }
    }
}

Đăng ký ViewController

Như đề cập phần trước, để sử dụng controller này vào phần mềm, bạn cần đăng ký ở Lớp App_Module như sau:

 //Đăng ký những controller sẽ được sử dụng trong phần mềm
        protected override void Register(ModuleControllerService service)
        {
            base.Register(service);
            service.Register<ProductViewController>();
        }
      

Chạy phần mềm

Chỉ vậy thôi, chạy phần mềm ở 3 app, các bạn chọn vào product rồi bấm hiển thị tên, sẽ được kết quả sau:

Windows form

  



Bố cục cơ bản của lớp App_Module

 

Bố cục cơ bản của lớp App_Module

Như đã đề cập ở bài Bố cục của 1 solution, App.Module project, đảm nhiệm hầu hết các business logic của một phần mềm bao gồm:

  1. Những thực thể (Entity): bao gồm persistent (có lưu dữ liệu) và NonPersistent (không lưu cơ sở dữ liệu)
  2. Những ViewController/Actions, định nghĩa những hành xử, và dịch vụ để cho người dùng thao tác với dữ liệu.
  3. Báo biểu, Dashboard...
Mặc định của XAF, mỗi khi khai báo một thực thể, ViewController, là phần mềm tự động lấy hết vào. Việc đăng ký không tường minh (implicitly) này có vẻ tiện lợi cho những bạn mới bắt đầu, nhưng nó có thể gây ra những bất tiện:
  1. Mất thời gian khi build:  XAF sẽ tìm tất cả những entity và controller và đăng ký vào hết.
  2. Bất tiện: Ví dụ bạn có 10 Viewcontroller, nhưng ở phiên bản này bạn chỉ có dùng 5. nhưng mặc định nó lấy hết. Nên bạn phải exclude. 
  3. Performance, như ở một bài viết chính XAF đã công bố. Để tăng tốc XAF, chúng ta nên custom ở khoảng này.
Vì thế mọi đối tượng làm việc với YAF, đều được đăng ký tường minh qua các hàm Register().
Mọi việc khởi tạo, đăng ký, chúng ta đều xử lý ở trong file App.Module.cs (lớp App_Module). Cụ thể như sau:

public sealed partial class App_Module : YsvMainModule
    {
        
        public App_Module() => InitializeComponent();
        //icon cho phần mềm
        protected override Icon ProductIcon => Resources.Main;
        //hình ảnh phần mềm
        protected override Image ProductImage => Resources.ProductImage;

        //true: sử dụng kết nối mặc định tới sqlce. Đường dẫn là <Thư mục dự án>/AppDb.sdf (không có mật khẩu). Cả 3 app đều dùng chung cơ sở dữ liệu này.
        //false: dùng ConnectionString được chỉ định trong file config.
        protected override bool UseDefaultSqlCEConnectionString => base.UseDefaultSqlCEConnectionString;
        //Khởi tạo các nhóm quyền mặc đinh. Nhóm quyền admin và user admin (không có mật khẩu)
        public override void InitEmployee(IObjectSpace os)
        {
            YsvUser.InitPermission<Employee>(os);
        }

        //Đăng ký những entities sử dụng trong phần mềm
        protected override void Register(ModuleEntityService service)
        {
            base.Register(service);
            service.Register<Employee>()
                .Register<Product>()
                .Register<AppSettings>();
        }
        // Khởi tạo cấu hình phần mềm
        public override void OnSetupComplete(XafApplication application)
        {
            base.OnSetupComplete(application);
            YsvAppSettings.Init<AppSettings>();
        }
        //Đăng ký ở những view, khi double-click nó sẽ không mở detail view
        protected override void Register(DisableDetailViewService service)
        {
            base.Register(service);
        }
        //Đăng ký những report sẽ sử dụng tron ghệ thống
        protected override void Register(IXtraReportService service)
        {
            base.Register(service);
        }
        //Đăng ký những lớp import dữ liệu từ excel.
        protected override void Register(IExcelImportService service)
        {
            base.Register(service);
        }
        //đăng ký những lớp có điền dữ liệu vào file excel
        protected override void Register(IFillDataToExcelTemplateService service)
        {
            base.Register(service);
        }
        //Đăng ký những controller sẽ được sử dụng trong phần mềm
        protected override void Register(ModuleControllerService service)
        {
            base.Register(service);
        }
    }