Hướng dẫn lập trình với SCSF phần I (smart client software factory)
1. HƯỚNG DẪN LẬP TRÌNH VỚI SCSF VÀ ENTITY FRAMEWORK
(HisFramework)
Mục Lục
Ph n I: T NG QUÁTầ Ổ ....................................................................................................................................1
I.Cài đ t SCSFặ ...........................................................................................................................................1
II.T o Business Moduleạ ...........................................................................................................................3
III.T o Viewạ ..............................................................................................................................................7
Phần I: TỔNG QUÁT
Phần source cài đặt và tài liệu có thể tham khảo Internet (http://smartclient.codeplex.com/)
I. Cài đặt SCSF
A. Cài đặt Visual Studio 2010
Source cài đặt VS 2010: 172.16.160.7SoftwaresSoftware Development ToolsVisual
StudioVisual Studio 2010.
Source cài đặt SCSF: 172.16.160.7SoftwaresSoftware Development ToolsFor
.NETSCSF
B. Cài đặt SCSF
Thứ tự cài đặt:
1. Visual Studio 2010 SDK (VsSDK_sfx.exe).
2. Cài đặt Visual Studio Extention
3. GAX 2010 (GAX2010.vsix).
4. GAT 2010 (GAT2010.vsix).
5. Smart Client Software Factory (SCSF2010.vsix).
Các bước cài đặt đơn giản nên không hướng dẫn cụ thể.
Sau khi cài đặt xong mở VS 2010 lên. Sau đó vào Menu Tool -> Extention Manager
Xem các Extention có được enable chưa nếu chưa thì enable.
C. Tạo Smart Client Solution
2. Tạo project mới
Mở VS 2010 lên Vào menu File -> New -> Project.
Hộp thoại New Project mở lên->Chọn các thông tin theo hình minh họa.
Xuất hiện hộp thoại Create Smart Client Solution. Chọn Finish (Nếu ứng dụng dạng WPF
bạn có thể check chọn “Allow solution to host WPF SmartParts”).
3. Cấu trúc của một Solution theo SCSF
II. Tạo Business Module
Đến phần này chúng ta đã biết cách tạo ra một Solution dạng SCSF và cấu trúc cơ bản của SCSF. Tiếp
theo chúng ta sẽ tìm hiểu cách để tạo ra một Business Module với SCSF.
4. A. Tạo Business Module
Right Click trên thư mục Source của Solution chọn các thông tin theo hình
minh họa.
Vì sao lại chọn thư mục Source mà không chọn thư mục InfraStructure.
Lý do để phân biệt với cấu trúc của SCSF. Nếu là dạng module dùng chung
cho nhiều module khác bạn cũng có thể add vào thư mục InfraStructure.
Hộp thoại Add Buisiness Module được mở lên chọn các thông tin theo hướng
dẫn.
Cách đặt tên Module theo qui tắc đặt tên Function (VD: ModuleTraining)
5. Thông tin của module vừa tạo được add vào file ProfileCatalog.xml trong
Shell Project
Bạn có thể cấu hình load module vừa tạo hay không bằng cách chuyển đoạn
code sang dạng chú thích (giống html)
B. Những việc cần làm sau khi tạo module
6. Reference CABDevExpress.ExtensionKit.dll trong thư mục Lib của solution
vào module vừa tạo.
Chuyển Module vừa tạo sang .Net Framework 4.0 bằng cách Right Click
vào Module vừa tạo tại cửa sổ Solution Explore -> Chọn Properties.Ở Tab
Application mục target framework chọn .NET Framework 4.
C. Các thành phần sử dụng chung cho Module
Khai báo các command
Mục đích tạo ra các Command để đăng ký lắng nghe các sự kiện theo tên
command.
Vào Project (<TenModule>.Interface) của module. Ở thư mục Constants ->
Chọn File CommandNames.cs.
Sau đó tạo ra một số command theo mẫu tùy, vào chức năng mà đặt tên cho phù
hợp do kiểu const string nên thống nhất chung command là chữ in hoa.
namespace CuscAppFramework.EquipmentReport.Interface.Constants
{
/// <summary>
/// Constants for command names.
/// </summary>
public class CommandNames : CuscAppFramework.Infrastructure.Interface.Constants.CommandNames
{
//Tạo command cho báo cáo nhập mới trang thiết bị
public const string IMP_REPORT = "IMP_REPORT";
// Tạo command cho trang thiết bị hiện có
public const string EXISTING_REPORT = "EXISTING_REPORT";
}
}
Khai báo quyền trên chức năng
Để khai báo các quyền thao tác trên chức năng
Bạn vào Project (<TenModule>.Interface) của module. Ở thư mục Constants
->Chọn Add-> New -> Chọn Class
Đặt tên là Rules.cs (Tên bắt buộc không thay đổi)
Sau đó tạo Class Rules có cấu trúc như sau
7. public class Rules
{
// Quyền truy cập chức năng báo cáo nhập trang thiết bị
public const string IMP_REPORT = "equipmentreport.impreport:access";
// Quyền xem báo cáo nhập trang thiết bị
public const string IMP_REPORT_VIEW = "equipmentreport.impreport.view:access";
// Quyền xuất excel báo cáo nhập trang thiết bị
public const string IMP_REPORT_EXCEL = "equipmentreport.impreport.excel:access";
}
III. Tạo View
View là thành phần chứa giao diện chức năng của module. Bản thân View là một user control và có thể
chứa các user control khác.
Để tạo View Right Click vào thư mục View của module cần tạo view sau đó chọn các thông tin theo hình
hướng dẫn
Hộp thoại tạo view được mở lên làm theo hướng dẫn
Lưu ý cách đặt tên view theo cấu trúc sau <View><TenChucNang> theo quy tắc đặt tên Function.
(Không cần tạo Folder cho view)
8. Mỗi khi tạo View sẽ kèm theo tạo Interface và Presenter cho View đó. Chi tiết và code các thành phần
này sẽ được giới thiệu sau.
Cấu trúc của View vừa tạo
Sau khi tạo View để có thể design. Chọn Reresh lại solution.
A. Viết Code cho IView (Theo cấu trúc của Cusc His Framework).
9. IView là interface cho View, Presenter sử dụng IView để trao đổi (Communication) với
View
Ví dụ IViewDonViTinh là interface cho View danh mục đơn vị tính cần có các thao tác:
Thêm, sửa , xóa, bỏ qua, lưu và load dữ liệu
Khi đó ta cần định nghĩa các hàm để thực thi công việc tương ứng cho ViewDonViTinh trên
IViewDonViTinh như sau:
public interface IViewDonViTinh
{
/// <summary>
/// Load thông tin đối tượng
/// </summary>
void LoadData();
/// <summary>
/// Thêm mới đối tượng
/// </summary>
void Add();
/// <summary>
/// Hiệu chỉnh đối tượng
/// </summary>
void Modify();
/// <summary>
/// Xóa đối tượng
/// </summary>
void Delete();
/// <summary>
/// Lưu thông tin đối tượng
/// </summary>
void Save();
/// <summary>
/// Hủy bỏ thao tác trước đó
/// </summary>
void Cancel();
}
B. Viết code cho Presenter (Theo cấu trúc của Cusc His Framework)
Là nơi chứa các nghiệp vụ logic của View
Phần code bắt buộc phải có của mỗi Presenter để phù hợp với CuscHisFramework
Thêm vào sử dụng CABDevExpress.SmartPartInfos
using CABDevExpress.SmartPartInfos;
/// <summary>
/// XtraWindowSmartPartInfo
/// </summary>
/// <param name="smartPartInfoType"></param>
/// <returns></returns>
public XtraWindowSmartPartInfo GetSmartPartInfo(Type smartPartInfoType)
10. {
XtraWindowSmartPartInfo smartPartInfo = (XtraWindowSmartPartInfo)Activator.CreateInstance(smartPa
rtInfoType);
smartPartInfo.Title = "Tên của view";
return smartPartInfo;
}
C. Viết code cho View (Theo cấu trúc của Cusc His Framework).
Phần code bắt buộc phải có của View để phù hợp với Cusc His Framework
View phải được kế thừa từ IsmartPartInfoProvider
Khai báo sử dụng Button Service trên view
/// <summary>
/// Trạng thái các nút thêm, sửa, xóa, lưu và bỏ qua trên QuickAccess
/// </summary>
private IButtonState _buttonState;
/// <summary>
/// Trạng thái các nút thêm, sửa, xóa, lưu và bỏ qua trên QuickAccess
/// </summary>
[ServiceDependency]
public IButtonState ButtonState
{
get { return _buttonState; }
set { _buttonState = value; }
}
Khởi tạo bộ nút theo lưới dữ liệu
VD: Nếu lưới có dữ liệu -> Bộ nút hiển thị thêm, sửa, xóa
Nếu lưới không có dữ liệu -> Bộ nút chỉ hiển thị thêm…
Có thể Mở rộng cho hàm khỏi tạo bộ nút vì không phải chức năng nào cũng có dữ liệu
Nếu trên View thiết kế không có lưới dữ liệu bạn thay thông tin lưới dũa liệu = null
void ParentForm_Activated(object sender, EventArgs e)
{
ButtonState.Init(this.luoiDuLieu, Infrastructure.Interface.Enum.EnumFormStatus.
VIEW, Rules.CURENCIES_ADD, Rules.CURENCIES_MODIFY, Rules.CURENCIES_DELETE);
ButtonState.SetAllowAdd(true);
ButtonState.SetAllowDelete(true);
ButtonState.SetAllowModify(true);
}
Rules.<QuyenTrenChucNang> Đã được khai báo ở lớp Rules.cs
Để cài đặt nhanh interface trên IView
11. Chọn vào View cần cài đặt interface Chọn view code. Sau đó Right Click vào IView tương
ứng của View-> Chọn Implement Interface. VS sẽ tự sinh ra các hàm tương ứng ở Iview. Sau
đó bạn có thể code trên thêm vào các đoạn code xử lý (Hướng dẫn ở phần hai).
D. Viết code cho Model (Theo cấu trúc của Cusc His Framework)
Tạo thư mục Model cho Module
Chỉ tạo Model cho một số xử lý phức tạp hoặc tạo dữ liệu cho các báo cáo không trả về dữ
liệu của một Entity nào của mô hình Entity Framework.
Nếu Model xử lý chung cho nhiều view đặt tên theo quy tắc <Model><TenModule>
Nếu Model chỉ xử lý cho một view duy nhất đặt tên theo quy tắc sau
<Model><TenChucNang>
E. Kiểm quyền & Tạo menu cho chức năng mới trong Module controller
Trước hết cần hiểu cấu trúc phần quyền của Cusc His Framework
Cơ chế cấp quyền theo vai trò (Role).Vai trò bao gồm những chức năng (Quyền, Object)
nào. Người dùng thuộc vai trò nào thì sẽ có quyền trên các chức năng tương ứng với vai trò
đó.
12. Trước khi vào phần này bạn cần khai báo quyền trong cơ sở dữ liệu tương ứng với từng
chức năng
Ví dụ khai báo quyền trên chức năng Báo cáo nhập mới trang thiết bị
Trước hết bạn nhập thông tin các quyền và bảng Object
Thông tin này phải giống với thông tin khai báo trong file Rules.cs đã được đề cập ở phần
trên.
13. Sau đó nhập thông tin vào bảng ObjectRole
(Gán quyền cho vai trò System để admin có quyền trên chức năng). Sau khi đăng nhập có thể
gán lại quyền lại bằng giao diện của chương trình.
Kiểm quyền và tạo menu
Vào Module controller của module cần tạo menu và kiểm quyền. Khai báo sử dụng
using CuscAppFramework.<TenModule>.Interface.Constants;
using CuscAppFramework.Infrastructure.Interface.Services;
Khai báo menu
VD Khai báo menu danh mục (CatalogMenu) ở
CuscAppFramework.Infrastructure.Interface.Constants
File UIExtensionSiteNames.cs
public const string CatalogMenu = "CatalogMenu";
14. Khai báo và register cho menu danh mục ở
CuscAppFramework.Infrastructure.Shell
File ShellApplication.cs
RibbonPage pCatalogs = new RibbonPage("Danh mục");
RootWorkItem.UIExtensionSites.RegisterSite(UIExtensionSiteNames.CatalogMenu, pCatalogs);
RootWorkItem.UIExtensionSites[UIExtensionSiteNames.Ribbon].Add(pCatalogs);
Khai báo đoạn code sử dụng Security Services (bắt buộc phải có trong
mỗi module để kiểm quyền) ở module controller.
/// <summary>
/// Kiểm quyền người dùng
/// </summary>
private ISecurityHelper _securityHelper;
[ServiceDependency]
public ISecurityHelper SecurityHelper
{
get { return _securityHelper; }
set { _securityHelper = value; }
}
Sau đó tìm đến hàm ExtendMenu ở module controller và khai báo đoạn
code kiểm tra quyền và tạo menu như sau
Giải thích: Trong đoạn code này khai báo một nhóm danh mục(GroupCatalogs1)
trên menu danh mục chính (CatalogMenu). Kiểm tra quyền trên danh mục tiền
tệ (CURENCIES), đơn vị tính (UNITS ) theo các Rules đã được định nghĩa
trước đó.
Nếu có quyền thì tạo ra button và add button này vào GroupCatalogs1
( BarButtonItem bbtn_curencies = new BarButtonItem();) .
Sau khi kiểm quyền nếu có ít nhất một chức năng có quyền thì add
GroupCatalogs1 vào menu danh mục (CatalogMenu)
// Thêm group quan ly danh muc 1
if (GroupCatalogs1.ItemLinks.Count > 0)
{
WorkItem.UIExtensionSites[UIExtensionSiteNames.CatalogMenu].Add(GroupCatalogs1 );
}
private void ExtendMenu()
15. {
#region Nhom danh muc 1
RibbonPageGroup GroupCatalogs1 = new RibbonPageGroup("");
// Kiểm quyền danh mục tiền tệ
if (SecurityHelper.Authorized(Rules.CURENCIES) || SecurityHelper.Authorized(Rules.CURENCIES
_VIEW))
{
BarButtonItem bbtn_curencies = new BarButtonItem();
bbtn_curencies.Caption = "Tiền tệ";
bbtn_curencies.Alignment = DevExpress.XtraBars.BarItemLinkAlignment.Left;
bbtn_curencies.LargeGlyph = global::CuscAppFramework.Catalogs.Properties.Resources.DanhMu
cTienTe;
bbtn_curencies.LargeWidth = 50;
bbtn_curencies.RibbonStyle = ((DevExpress.XtraBars.Ribbon.RibbonItemStyles)
(((DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large | DevExpress.XtraBars.Ribbon.RibbonItemStyles.S
mallWithText)
| DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithoutText)));
GroupCatalogs1.ItemLinks.Add(bbtn_curencies);
WorkItem.Commands[CommandNames.CURENCIES].AddInvoker(bbtn_curencies, "ItemClick");
}
// Kiểm quyền danh mục đơn vị tính
if (SecurityHelper.Authorized(Rules.UNITS) || SecurityHelper.Authorized(Rules.UNITS_VIEW))
{
BarButtonItem bbtn_units = new BarButtonItem();
bbtn_units.Caption = "Đơn vị tính";
bbtn_units.Alignment = DevExpress.XtraBars.BarItemLinkAlignment.Left;
bbtn_units.LargeGlyph = global::CuscAppFramework.Catalogs.Properties.Resources.DanhMucDo
nViTinh;
bbtn_units.LargeWidth = 70;
bbtn_units.RibbonStyle = ((DevExpress.XtraBars.Ribbon.RibbonItemStyles)
(((DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large | DevExpress.XtraBars.Ribbon.RibbonItemStyles.S
mallWithText)
| DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithoutText)));
GroupCatalogs1.ItemLinks.Add(bbtn_units);
WorkItem.Commands[CommandNames.UNITS].AddInvoker(bbtn_units, "ItemClick");
}
// Thêm group quan ly danh muc 1
if (GroupCatalogs1.ItemLinks.Count > 0)
{
WorkItem.UIExtensionSites[UIExtensionSiteNames.CatalogMenu].Add(GroupCatalogs1
);
}
#endregion
}
Khai báo sự kiện mở View (chức năng) ở Shell Form trong Module controler
Ví dụ khai báo sự kiện nhấn nút danh mục đơn vị tính trên Shell Form
[CommandHandler(CommandNames.UNITS)]
public void OnUnitsClick(object sender, EventArgs e)