I. PLUG-IN LÀ GÌ?
"Trong kỹ thuật máy tính, plugin là một bộ phần mềm hỗ trợ mà thêm những tính năng cụ thể cho một phần mềm ứng dụng lớn hơn. Nếu được hỗ trợ, plugin cho phép tùy biến các chức năng của một ứng dụng. Ví dụ, plugin thường được sử dụng trong các trình duyệt web để chơi video, quét virus, và hiển thị các tập tin mới. Ví dụ hai plugin được biết đến rộng rãi bao gồm Adobe Flash Player và QuickTime."--http://vi.wikipedia.org/wiki/Plugin.
Tóm lại plugin là một phần mềm mà mình viết độc lập với chương trình chính nhằm thêm mới chức năng.
II. VÍ DỤ MINH HỌA
Trong phần này mình sẽ viết một chương trình WinForm minh họa Plugin.
1. Đề bài
Vì nhu cầu giải toán của học sinh lớp 1 tăng cao, cho nên các chuyên gia đề xuất viết một chương trình máy tính (Calculator) để làm cho học sinh lớp 1 dễ dàng làm toán hơn. các phép toán thì có rất nhiều: cộng, trừ, nhân, chia... nhưng vì đội ngũ nhân lực chỉ có hai người có hạn nên tạm thời chỉ viết chương trình tính phép cộng trước đã, còn các phép tính khác sẽ để sau này có thời gian thì viết tiếp (tạo các plugin trừ, nhân, chia,... và gắn vào chương trình Calculator).
Nhưng ở đây tôi sẽ viết luôn một thư viện(cũng có thể hiểu là plugin) CalculatePluginLibrary.dll gồm hai phép trừ (CalculatePluginLibrary.Minus) và nhân (CalculatePluginLibrary.Multiply) luôn.
2. Giao diện chương trình chính
Các bạn đừng ngại thiết kế lại giao diện nhé, nếu ngại thì chẳng hiểu được đâu. hehe
Mở Visual Studio lên, chọn New Project -> Window Form, đặt tên cho solution là CalculatorWithPlugin và thiết kế như bên dưới.
- lbxFunctions là để chứa các chức năng mà mình muốn chương trình làm (ví dụ cộng, trừ, nhân, chia...)
- còn tại mnsPlugin có chức năng thêm các plugin mới vào cho chương trình (Add Plugin)
3. Tạo Interface ICalculate
Để các plugin có thể gán vào chương trình CalculatorWithPlugin , chúng ta phải đặt ra một số qui tắc qui định những plugin nào mới có thể được gắn vào chương trình. Interface chính là để làm điều đó.
Tạo một Solution mới độc lập với solution CalculatorWithPlugin, loại của solution này là Class
Library, đặt tên là Interfaces. Mã chương trình như sau:
// Comment using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Interfaces { public interface ICalculate { int Operate(int a, int b); } }sau đó buld chương trình này, trình biên dịch sẽ tạo ra một file Interfaces.dll trong thư mục ...Interfaces\bin\Debug. Tẹo nữa chúng ta sẽ dùng đến nó để qui định plugin nào được gắn vào chương trình CalculatorWithPlugin của chúng ta.
4. Viết một thư viện .dll để gắn vào chương trình chính (cái này gọi là 1 Plug-in)
Mở Visual Studio lên và tạo một Solution mới với tên là CalculatePluginLibrary, loại của Solution này cũng là Class Library. Sau đó vào phần Solution Exploer -> reference-> nháy chuột phải và chọn Add reference -> chọn đến file Interfaces.dll mà chúng ta vừa mới tạo.
sau đó trong solution này tạo hai Class là Minus và Multiply:
// Comment using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Interfaces; namespace CalculatePluginLibrary { class Minus:ICalculate { public int Operate(int a, int b) { return (a-b); } } } }
// Comment using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Interfaces; namespace CalculatePluginLibrary { public class Multiply:ICalculate { public int Operate(int a, int b) { return a * b; } } }Sau đó build chương trình và chúng ta sẽ nhận được một file thư viện (plugin) CalculatePluginLibrary.dll
5. Viết code trên chương trình chính
Ô kê, phần viết plugin đã xong, chúng ta sẽ viết phần chương trình chính, ngoài việc tính toán được phép cộng, chúng ta cũng có thể add CalculatePluginLibrary.dll để tính toán phép trừ và nhân. dưới là code chương trình:
note: nhớ using System.Reflection nhé
// Comment public partial class Form1 : Form { private ArrayList plugins = new ArrayList(); private int a; private int b; public Form1() { InitializeComponent(); } private void addPluginToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog openDialog = new OpenFileDialog(); openDialog.InitialDirectory = "c:\\"; openDialog.Filter = "Calculate plugin files (*.dll)|*.dll"; if (openDialog.ShowDialog()==DialogResult.OK) { string file = openDialog.FileName; AddPlugIn(file); } } private void AddPlugIn(string file) { try { Assembly ab = Assembly.LoadFrom(file); Type[] types = ab.GetTypes(); foreach (Type t in types) { if (t.GetInterface("ICalculate") != null) { plugins.Add(ab.CreateInstance(t.FullName)); lbxFunctions.Items.Add(t.FullName); } } } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void btnOperate_Click(object sender, EventArgs e) { if (this.lbxFunctions.SelectedIndex == -1) return; //initial value a = int.Parse(txtFirstNumber.Text.Trim()); b = int.Parse(txtSecondNumber.Text.Trim()); // if (this.lbxFunctions.SelectedIndex==0) { MessageBox.Show((a+b).ToString()); } else { object selObj = this.plugins[this.lbxFunctions.SelectedIndex-1]; Type t = selObj.GetType(); MethodInfo onOperate = t.GetMethod("Operate"); object returnValue = onOperate.Invoke(selObj, new object[] { a, b }); MessageBox.Show(returnValue.ToString()); } } private void Form1_Load(object sender, EventArgs e) { lbxFunctions.Items.Add("Add"); } }6. chạy thử nghiệm và kết quả
sau khi viết xong chương trình chính, chúng ta chạy thử chương trình. nếu bạn chưa Add Plugin thì chương trình của bạn chỉ thực hiện được phép cộng thôi.
Nhưng nếu bạn chọn PlugIn -> Add Plugin -> chọn đến thư viện CalculatePluginLibrary.dll thì trong Listbox sẽ xuất hiện thêm hai chức năng nữa, đó là CalculatePluginLibrary.Minus và CalculatePluginLibrary.Multiply
Lưu ý: trong bài này tôi viết Interface ICalculator là để chỉ cho phép các lớp có thừa kế từ ICalculator mới được phép đưa vào trong chương trình. Bạn cứ thử chọn PlugIn -> Add Plugin -> chọn đến thư viện .dll khác mà xem, trong lbxFunction sẽ không hiện gì khác ngoài Intem Add đâu.
Không có nhận xét nào :
Đăng nhận xét