Mục đích sử dụng
Một interface giống như class, nhưng không có phần thực thi. Trong đó interface chỉ chứa các khai báo:
- Sự kiện (event)
- Indexer (một dạng thuộc tính đặc biệt trong C# cho phép lấy giá trị dựa trên chỉ mục)
- Phương thức (method)
- Thuộc tính (property)
Một lý do tại sao interface chỉ chứa khai báo vì nó được kế thừa để thực thi bởi cả các lớp (class) và cấu trúc (struct)
Vậy, đâu là lợi thế khi interface không thực thi các chức năng?
Đó là vì trong các kiến trúc hệ thống làm việc với nhau theo dạng cắm – chạy (plug-n-play), các thành phần ở đó sẽ trao đổi thông tin cho nhau. Khi trao đổi thông tin, các thành phần sẽ thực thi chung interface, việc này có thể được sử dụng mà không cần phải viết thêm code. Theo đó, các interface sẽ bắt buộc các thành phần cung cấp đầy đủ các thành viên (member) ở dạng công khai (public) để được sử dụng theo cùng một cách thống nhất.
Bởi vì các interface được thực thi bởi các lớp và cấu trúc dẫn xuất nên chúng định nghĩa ra một bản giao kèo (contract).
Một số đặc tính nổi bật của interface
- Interface có thể được kế thừa từ nhiều interface cơ sở (base interface)
- Các class hay struct có thể thực thi cùng lúc nhiều interface
- Interface chỉ chứa các khai báo thành viên event, indexer, method, property.
- Các thành viên của interface đều ở dạng công khai (public)
- Interface có thể sử dụng với generic để tạo thành các generic interface
- Các khai báo thành viên của interface có thể ở dạng generic
Định nghĩa một interface
Trong khai báo interface thì thành phần bắt buộc phải có gồm:
- Từ khóa interface
- Định danh (tên) interface
- Phần thân khai báo cho interface (interface-body)
Ví dụ một số ví dụ nhỏ khai báo interface
Sử dụng interface để tạo lớp thực thi chúng
Ví dụ điển hình áp dụng interface trong thiết kế mẫu Repository
Để đơn giản ví dụ mẫu sẽ chọn cách thực thi code với các chú ý sau:
- Tạo một project C# ở dạng Console Application.
- Cài đặt “EntityFramework.SqlServerCompact” để sử dụng dữ liệu cục bộ:
- Chọn mở “Manage NuGet Packages” bằng cách nhấn phải ở tên project trong cửa sổ Solution Explorer chọn từ menu ngữ cảnh
- Trong cột bên trái chọn Online -> nuget.org
- Gõ từ khóa EntityFramework ở hộp text nhỏ ở góc trên cùng bên phải
- Từ kết quả ở vùng giữa chọn EntityFrameworkSqlServerCompact và chọn Install (quá trình cài đặt có thể xuất hiện cửa sổ về quyền tác giả bạn chỉ cần chọn đồng ý Accept)
- Cấu trúc các thư mục và các thành phân trong project được thể hiện như sau:
Ta lần lượt tạo các thành phần với mã nguồn như sau:
- Model chính lớp học (Batch) và sinh viên (Student)
- Interface IRepository ở dạng generic quy định các phương thức chung
- Tạo tiếp hai Repository cho 2 model tương ứng kế thừa từ Irepository
- Tạo lớp ModelContext kế thừa DbContext để quản lý các thành phần tương tác database
- Tạo hai lớp thực thi giao diện IBatchRepository, IStudentRepository
Để kiểm soát sự cập nhật thay đổi model ánh xạ lên database ta sử dụng chức năng Migration của EntityFramework.
- Kích hoạt sử dụng Migration bằng cách
- Mở cửa sổ “Package Manager Console” (menu Tools -> NuGet Package Manager -> Package Manager Console)
- Tại cửa sổ dòng lệnh “Enable-Migrations”, dòng lệnh sẽ được thực thi và sẽ hình thành thư mục Migrations cùng file Configuration.cs
- Mở file Configuration trong thư mục Migrations để thêm code khởi tạo dữ liệu cho database khi tạo mới trong phương thức Seed:
- Sử dụng chức năng của Migration để thêm lớp quản lý thao tác nâng / hạ cấp (up /down) với database bằng cách gõ lệnh “Add-Migration InitDataBase” trong cửa sổ lệnh “Package Manager Console” (InitDataBase là tên lớp sẽ tạo ra)
- Cập nhật để tạo database bằng cách gõ lệnh “Update-Database”
Cuối cùng ta sẽ test trên giao diện console ứng dụng bằng cách bổ xung code trong phương thức Main của file Program.cs
Và đây là thành quả khi chạy chương trình: