[SOFTWARE DESIGN] Thiết kế phần mềm theo mô hình 3 lớp Layer

Hướng tới lập trình chuyên nghiệp (nói cho oai chứ mình gà lắm) - không chỉ về mặt code , thuật toán ... mà bạn cần phải thiết kế phần mềm sao cho dễ chỉnh sửa , cập nhật nhất (nhất là đối với code team và bạn đã định hướng phát triển phần mềm lâu dài)

Hôm nay mình xin giới thiệu một cách thiết kế khá phổ biết là "MÔ HÌNH 3 LỚP LAYER"

1. Giới thiệu tổng quan
Như tên của mô hình. Chúng ta sẽ thiết kế phần mềm theo 3 lớp sau :
- GUI Layer : chuyên xử lí về GUI (giao diện)
- Business Layer : chuyên xử lí về nghiệp vụ, thuật toán....
- Data Access Layer : đưa dữ liệu xuống cơ sở dữ liệu cũng như lấy dữ liệu từ cơ sở dữ liệu lên

Ngoài ra chúng ta dùng thêm 1 class là : Data Transfer Object (DTO) có chức năng là cầu nối giữa các Layer. (Ta cũng có thể dùng các parameter để truyền dữ liệu , tùy nhiên nhiều parameters quá thì nên dùng tên class này)

2. Các bước thiết kế phần mềm theo mô hình 3 lớp layer
Bây giờ chúng ta cùng nhau thiết kế một phần mềm đơn giản nhé ^^

Để đơn giản ở đây tôi không dùng hệ quản trị cơ sở dữ liệu mà ghi dữ liệu ra file "Data.txt"  (Coi như nó là DataBase đi :D -- File này sẽ chỉ ghi được 1 tài khoản thôi nhưng đây là ví dụ mà -- các bạn có thể áp dụng vào các hệ quản trị CSDL giống như vậy)

- Thiết kế một GUI như sau :
GUI có 2 textbox : txtTaiKhoan và txtMatKhau và một button : btnDangKi

- Tạo các Folder vào các class như hình dưới đây :
(GUI Layer : frmRegister.cs | Business Layer : XuLi.cs | Data Access Layer : VanChuyenDuLieu.cs
và DTO.cs)
- OK Tiến hành code nhé :

** DTO.cs (Nơi đây chỉ chứa các biến vận chuyển) :

namespace MOHINH3LOPLAYER
{
    public class DTO
    {
        private string _TaiKhoan;
        private string _MatKhau;
        public string TaiKhoan
        {
            set {_TaiKhoan = value;}
            get {return _TaiKhoan;}
        }
        public string MatKhau
        {
            set {_MatKhau = value;}
            get {return _MatKhau;}
        }
    }
}


**VanChuyenDuLieu.cs (Nơi đây chỉ có chức năng đọc/ghi dữ liệu xuống CSDL)
Ở phương thức GhiDuLieu tôi sẽ truyền vào đối tượng DTO
namespace MOHINH3LOPLAYER.Data_Access_Layer
{
    public class VanChuyenDuLieu
    {
        public static void GhiDuLieu(DTO doituong)
        {
            FileStream fs = new FileStream("Data.txt", FileMode.Create, FileAccess.ReadWrite, FileShare.None);
            StreamWriter sw = new StreamWriter(fs);
            sw.WriteLine(doituong.TaiKhoan);
            sw.WriteLine(doituong.MatKhau);
            sw.Flush();
            sw.Close();
        }
    }
}
** XuLi.cs (Nơi đây chỉ có chức năng xử lí thuật toán)

namespace MOHINH3LOPLAYER.Business_Layer
{
    public class XuLi
    {
        private static bool KiemTra(DTO doituong)
        {
            if (doituong.TaiKhoan != "" && doituong.MatKhau != "")
                return true;
            return false;
        }
        public static bool DangKi(DTO doituong)
        {
            if (!KiemTra(doituong))
                return false;
            MOHINH3LOPLAYER.Data_Access_Layer.VanChuyenDuLieu.GhiDuLieu(doituong);
            return true;
        }
    }
}

** Và cuối cùng là Xử lí nút "Đăng kí ở GUI" như sau :

private void btnDangKI_Click(object sender, EventArgs e)
        {
                         // Tạo đối tượng DTO
            DTO doituong = new DTO();
            doituong.TaiKhoan = this.txtTaiKhoan.Text;
            doituong.MatKhau = this.txtMatKhau.Text;

            if (MOHINH3LOPLAYER.Business_Layer.XuLi.DangKi(doituong))
            {
                MessageBox.Show("Đăng kí thành công");
            }
            else
            {
                MessageBox.Show("Đăng kí thất bại");
            }
        }

OK như vậy là xong ^^! Đơn giản đúng không :D

4/14/2014
Đăng bởi :

Code quay lui bằng C# tìm tổ hợp, chỉnh hợp chập k của n

thuvienwinform - Thuật toán trâu bò quen thuộc và khá hữu ích trong việc code. Để tìm tổ hợp đơn giản là tìm một dãy số thỏa mãn điều kiện sau:
- Các số đều khác nhau
- Số sau lớn hơn số trước
- Các bộ số không trùng lặp nhau
-...

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace QuayLuiTimToHop
{
    class Program
    {
        #region Khai báo
        static int n, k;
        static int[] a, dau;
        #endregion

        #region THủ tục
        private static void Xuat(int i)
        {
            for (int j = 1; j <= k; j++)
                Console.Write(a[j] + " ");
            Console.WriteLine();
        }

        private static void Duyet(int i)
        {
            if (i > k) Xuat(i);
            else
            {
                int j;
                for (j = a[i - 1]; j <= n; j++)
                {
                    if (dau[j] == 0)
                    {
                        a[i] = j;
                        dau[j] = 1;
                        Duyet(i+1);
                        dau[j] = 0;
                    }
                }
            }
        }
        #endregion

        static void Main(string[] args)
        {
            #region Đầu vào
            Console.Write("Nhap va n: ");
            n = Convert.ToInt32(Console.ReadLine());
            Console.Write("Nhap va k: ");
            k = Convert.ToInt32(Console.ReadLine());
            a = new int[n+1];
            dau = new int[n+1];
            for (int i = 0; i < n + 1; i++)
                dau[i] = 0;
            #endregion

            #region Xử lí
            Console.WriteLine("To hop chap " + k + " cua " + n + ": ");
            a[0] = 1;
            Duyet(1);
            #endregion

            Console.ReadKey();
        }
    }
}
Dãy cần tìm là a
Thuật toán quay lui với vòng lặp sẽ bắt đầu từ a[i-1] đề thỏa mãn điều kiện các số khác nhau và số sau lớn hơn số trước. Trong quá trình duyệt kết hợp đánh dấu phần tử đã sử dụng để không bị trùng (ở trong này mình dùng mảng dau)
Khi tìm đủ k phần tử cho mảng a thì xuất ra.

Về lí thuyết quay lui có thể tham khảo trong sách giải thuật và lập trình của Lê Minh Hoàng

Với code này chuyển thành tính chỉnh hợp cũng không có gỉ cả, chỉ cẩn thay vòng lặp thành thế này là OK
Các số trong bộ số sẽ không phải là từ a[i-1] nữa mà là từ 1

for (j = 1; j <= n; j++)
{
    if (dau[j] == 0)
    {
        a[i] = j;
        dau[j] = 1;
        Duyet(i+1);
        dau[j] = 0;
    }
}
4/13/2014
Đăng bởi :
Nhãn :

[API] Phát nhạc MP3

Như chúng ta đã biết thư viện "System.Media" chỉ cho phép chạy file âm thanh ".wav" nhiều chúng ta chạy file MP3 rất khó khăn (làm một chương trình phát nhac đơn giản chẳng hạn -- không dùng dll của Windows Media đâu nhé)

Hôm nay mình sẽ hướng dẫn các bạn sử dụng API để chạy file MP3 trong C#.
Các bước như sau :

1. Đừng quên "using System.Runtime.InteropServices;" để sử dụng API nhé.

2. Import Dll "winmm.dll"
[DllImport("winmm.dll")]

private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);

Hàm API này không hẳn có chức năng chạy MP3 mà nó là 1 hàm cho phép thực hiện câu lệnh được Coder đưa vào qua 1 string là strCommad . như vậy parameters này là quan trọng nhất (và mình cũng không biết các param khác có chức năng gì -- thôi thì cứ null -- API thường vậy mà HIHI ^^)

3. Giới thiệu các Commad để chạy 1 file MP3
- Mở MP3 :  "open "Đường dẫn tới file mp3" type mpegvideo alias MediaFile"
ví dụ : "open "E:\MUSIC\nhac.mp3" type mpegvideo alias MediaFile"
- Chạy MP3 vừa mở :  "play MediaFile"
Có thể dùng "play MediaFile REPEAT" để phát đi phát lại file MP3 vừa mở
- Dừng MP3 : "close MediaFile"


Nếu chưa làm được hãy xem ví dụ này :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace MP3
{
    public partial class Form1 : Form
    {
        public bool isOpen = false;

        public Form1()
        {
            InitializeComponent();
        }
                  // Import Dll này vô
        [DllImport("winmm.dll")]'

        private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);

        // BUTTON PLAY MP3
        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog op = new OpenFileDialog();
            op.Filter = "MP3 (*.mp3)|*.mp3";
            if (op.ShowDialog() == DialogResult.OK)
            {
                string szFile = op.FileName;
                MP3Open(szFile); 
                Mp3Play(false);
            }
        }
        // BUTTON STOP MP3
        private void button2_Click(object sender, EventArgs e)
        {
            Mp3Close();
        }

        // PHẦN XỬ LÍ ----------------------------------------------------------------------------------
        public void MP3Open(string szFileName)
        {
            string szCommad = "open \"" + szFileName + "\" type mpegvideo alias MediaFile";
            MessageBox.Show(szCommad);
           mciSendString(szCommand, null, 0, IntPtr.Zero);
            isOpen = true;
        }
        public void Mp3Close()
        {
            string szCommand = "close MediaFile";
            mciSendString(szCommand, null, 0, IntPtr.Zero);
            isOpen = false;
        }

        public void Mp3Play(bool isLoop)
        {
            if (isOpen)
            {
                string szCommand = "play MediaFile";
                if (isLoop) szCommand += " REPEAT";
                mciSendString(szCommand, null, 0, IntPtr.Zero);
            }
        }
    }
}

Đăng bởi :
Nhãn : ,

[API] Kiểm tra kết nối Internet

Trong nhiều chương trình, chúng ta cần thao tác với Server qua Network , song nếu máy tính chưa kết nối Internet thì chương trình rất có thể bị "Treo" do cố gắng làm những công việc bạn code (Đơn giản như chương trình gửi mail - hãy thử ngắt kết nối Internet và chạy chương trình :D)

Hôm nay mình sẽ hướng dẫn các bạn làm sao để kiểm tra máy tính có đang kết nối Internet !

1. Nhớ "using System.Runtime.InteropServices;"  để có thể sử dụng API

2. Import DLL "wininet.dll"
[DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int Description, int ReservedValue);

Ở đây hàm này sẽ trả về true nếu có kết nối internet và false nếu không ^^!


* Nếu các bạn chưa làm được có thể xem ví dụ dưới đây

    public class INTERNET
    {
        [DllImport("wininet.dll")]
        private extern static bool InternetGetConnectedState(out int Description, int                                                                                                                                        ReservedValue);
        public static bool ISINTERNETCONNECTED()
        {
            int des;
            if (InternetGetConnectedState(out des, 0) == true)
                return true;
            return false;        }
   }





Đăng bởi :
Nhãn : ,

NVNhan's Blog đăng loạt bài giới thiệu và hướng dẫn từng bước xây dựng một website bằng ASP MVC


thuvienwinform - Ngôn ngữ C# ngoài lập trình cho winform còn lập trình được cho cả webform (tức các trang web). Được phát triển bởi Microsoft, hiện nay các trang web viết bằng ASP MVC ngày càng nhiều. Công nghệ MVC mang lại cho coder cách tổ chức code khoa học hơn. Hiện nay blog NVNhan đang đăng các bài viết hết sức cơ bản dành cho các bạn mới làm quen với ASP, ASPMVC có một cách tiếp cận nhanh nhất với việc lập trình web. Mời các bạn đón đọc tại:
hoặc


Giao diện NVNhan's Blog

Với tiêu chí ngắn gọn, xúc tích, đơn giản và dễ hiểu. Các bài viết trên blog sẽ trang bị cho bản các kiến thức hết sức cơn bản về lập trình web, từ lúc bắt đầu tạo project đến lúc hoàn thành ra sản phẩm.
Kính mời các bạn đón đọc!
4/10/2014
Đăng bởi :
Nhãn :

Code gửi thư bằng gmail

thuvienwinform - Ứng dụng của nó khá nhiều ví dụ như báo lỗi sản phẩm, liên hệ tác giả, lấy key,...Trong code mình dùng máy chủ smtp của google. Các bạn có thể dùng các máy chủ khác hỗ trợ smtp như OutLook nhưng khi đó địa chỉ máy chủ và cổng sẽ khác, chỉnh lại là OK. Nếu code không hoạt động thì bạn tham khảo cách cài đặt tài khoản Gmail để smtp hoạt động ở bài: http://thuvienwinform.blogspot.com/2014/03/tfs-thiet-lap-email-thong-bao-alert-cho-team-foundation-server-bang-gmail-hoac-live-mail-giup-cap-nhat-cong-viec-kip-thoi.html

Project demo: https://www.dropbox.com/s/ey7fksmiddqjpkm/thuvienwinform-GuiThu.rar (26KB)

Sử dụng 2 thư viện:
+ using System.Net.Mail;
+ using System.Net;
để thực hiện công việc này

Code:
  
private void GuiThu(string diachigui, string matkhau, string diachinhan, string tieude, string noidung)
{
//using System.Net.Mail;
//using System.Net;
    #region Tạo nội dung thư
    MailMessage mail = new MailMessage(diachigui, diachinhan, tieude, noidung);
    #endregion

    #region Cấu hình smtp
    SmtpClient smtp = new SmtpClient()
    {
        //Máy chủ smtp
        Host = "smtp.gmail.com",
        //Cổng gửi thư
        Port = 587,
        //Tài khoản Gmail
        Credentials = new NetworkCredential(diachigui, matkhau),
        EnableSsl = true
    };
    #endregion

    #region Gửi thư
    smtp.Send(mail);
    #endregion
} 
4/08/2014
Đăng bởi :
Nhãn :

[TFS]Xóa project, work Item

thuvienwinform - Thực sự thì theo phương pháp WeareHouse thì không xóa được project và Work Item trong Tfs nhưng thực tế thì ta có thể thực hiện công việc này như sau:

1. Xóa project
- Có thể Admin sẽ xóa các User khỏi project đó đi -> trên máy người khác sẽ không thấy nữa (thực tế là nó bị ẩn). Nên dùng cách này vì còn có thể khôi phục được
- Hoặc xóa trong Tfs Admin Console (không khôi phục được)

- Hoặc dùng comand sau (phải cài Visual Studio) (phải gõ vào notepad xong copy, paste vào cmd):

cd C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE
TfsDeleteProject /force /collection:http://Ohia-PC:8080/tfs/DefaultCollection/ "Xóa anh đi 2"

- Với
+ C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE:  là được dẫn đến thư mục IDE của Visual Studio
http://Ohia-PC:8080/tfs/DefaultCollection/: là đường dẫn đến Collection
+ Xóa anh đi 2 là tên project cần xóa.

2. Xóa WorkItem:
- Command:
witadmin destroywi /collection:http://Ohia-PC:8080/tfs/DefaultCollection/ /id:id1, id2, id3


- Trong đó:
http://Ohia-PC:8080/tfs/DefaultCollection/: là đường dẫn đến collection
+ id1, id2, id3: là id các workitem cần xóa

- Hoặc có thể dùng ứng dụng của TEK xóa trực tiếp ngay trong Visual Studio. Bạn nào cần liên hệ mình gửi cho :)

My dictionary - tự xây dựng từ điển cuả riêng bạn!






thuvienwinform - Cảm ơn bạn Bùi Đức Duy đã mang đến MY DICTIONARY. Một phần mềm giúp người dùng tự xây dựng 1 cuốn từ điển cho riêng mình. Phần mềm sẽ tự động thống kê và đánh giá vốn từ của bạn thông qua tổng số từ bạn đưa vào từ điển.

Link (Giải nén và sử dụng) (1.89MB) : 
https://www.mediafire.com/?qen53rkal9wx8w3

Chức năng chính : 
+ Thêm | Sửa | Xóa từ trong từ điển của bạn 1 cách dễ dàng
+ Quản lí theo tài khoản (Hỗ trợ cho nhiều người dùng 1 máy tính ... - Thống kê số từ và đánh giá)
+ Hỗ trợ đổi mật khẩu | Tên | Hình đại diện cho người dùng
+ Nâng câp lên phiên bản PRO :
--- Liên kết tài khoản trong cùng 1 máy tính (Đồng bộ hóa từ điển vào nhau)
--- Chia sẻ tài khoản sang máy tính khác

Đặc biệt phần mềm có dung lượng cực nhỏ. Chỉ ~4MB. 
Chạy trên mọi HĐH 
Hỗ trợ tốt đồ họa cho Windows 7 trở lên !



Ở trong chương trình này có 2 công nghệ khá hay là gửi thư và phát âm mình sẽ giới thiệu trong vài bài tiếp theo. Các bạn tải về và cho đánh giá nha

[TFS] Quy định về quản lí code

thuvienwinform - Có thể sau một thời gian sử dụng chúng ta sẽ gặp những lỗi gây ức chế từ việc quản lí code của TFS@! Cụ thể là hiện tượng conflict, mất file, ...Để hạn chế tình trạng này mình đề nghị như sau:

- Về lỗi thiếu file. Ta sẽ thử cho một bạn up from lên rồi một bạn get về xem có thực sự là trên server có mà lại không get được không? Nếu thực sự như vậy thì TFS quá tệ@!

- Với form của mình không được phép conflict (kể cả check-in và get last version) vì chỉ mình mình sửa form đó thôi

- Để hạn chế conflict:
+ Chỉ check-in form của mình.
+ Khi conflict ở form không phải của mình thì cứ take server version thôi.
+ Khi conflict ở form của mình thì phải xem lại ai đã check-in form đó lên vào thực hiện ghép code lại cẩn thận (Merge) rồi hẵng check-in
+ Với các file dùng chung (DB, .sln, .csproj,...) thì dành cho bạn nào làm frmMain, sau khi chỉnh lại cho các form gắn kết đc với nhau thì sẽ check-in các file này (check-in cả project - không check-in solution)  (lúc này thường là lỗi DB và thiếu Reference, còn lỗi trong form thì phải đề nghị sửa lại). Và đó sẽ là bản final cho lần sửa đó.

- Với một số form dùng chung nhau, ví dụ như dùng form hiển thị file word thì thường gặp lỗi về DB và đầu vào cho form. Để hạn chế thì phải thống nhất code đầu vào và DB trên 2 máy mới thực hiện được.

- Conflict là gì?
Conflict xẩy ra khi 2 hay nhiều người cùng sửa 1 file. Ví dụ thế này:
Người 1: lấy phiên bản 1 về -> sửa -> tải lên (Check-in) -> thành bản 2
Người 2: lấy phiên bản 1 về -> sửa -> tải lên (Check-in) -> conflict.

Khi xẩy ra conflict có 3 lựa chọn sau:
+ Merge: ghép code file của người 2 (file local) với file trên server (phiên bản 2 của người 1 up lên). Khi ghép thì ta sẽ chọn những phần nào khác nhau để lấy về. Chọn những phần khác nhau giữa 2 phiên bản sẽ có phiên bản đầy đủ của file này. Sau khi ghép xong thì có thể check-in bình thường.
+ Take Server Version: tức là sẽ lấy phiên bản trên server (phiên bản 2) về -> mất hết những gì đã sửa
+ Keep Local Version: tức là sẽ giữ nguyên bản trên máy. Không lấy bản 2 kia về. Khi này trên server là phiên bản 2. Trên máy có thể là phiên bản 3 (nhưng chưa check-in) -> rất kho cho sau này.
Phương pháp lựa chọn tối ưu vẫn là ghép code. Để hạn chế xẩy ra conflict khi check-in thì không để nhiều người cùng sửa 1 file.

Chúc chúng ta có những dự án thật thành công :)

[TFS] Chuyển Team Foundation Server giữa các server, các máy (video + ảnh)


thuvienwinform - Rất nhiều trường hợp, có thể là SQL Server gặp lỗi và phải cài lại, hay chỉ vì muốn đổi lại tên Server mà có thể xẩy ra những lỗi đối với Team Foundaiton Server (cụ thể là lỗi TF246017). Khi đó TFS sẽ mất kết nối với CSDL (cụ thể là database Tfs_Configuration). Cách khắc phục rất đơn giản. Chỉ cần vài dòng lệnh là xong!

- Chuẩn bị:
+ File TfsRestore.bat: https://www.dropbox.com/s/gclsrza6kjshtqz/TfsRestore.bat (2KB)
+ Máy có cái  Team Foundation Server, SQL Server

- Giải thich một số lệnh trong file .bat:
+ TfsConfig TfsServiceControl quiesce: dừng Team Foundation lại
+ TfsConfig TfsServiceControl unquiesce: khởi động lại Team Foundation
+ TfsConfig Accounts /ResetOwner: thiết lập tài khoản Owner cho file Database (cần thiết khi chuyển từ máy này sang máy khác)
+ TfsConfig Accounts /add /AccountType:ApplicationTier: thêm tài khoản ApplicationTier
+ TfsConfig RegisterDB: Thiết lập database cho Tfs. Đối với việc chuyển từ server này sang server khác cùng máy chỉ cẩn chuyển database và chạy lệnh này là OK

- Tình huống:
+ Thêm mới 1 server và muốn chuyển TFS sang đó
+ Hoặc chuyển TFS từ máy này sang máy khác
+ Cài lại SQL Server, cài lại win

- Cách làm này có thể khắc phục được lỗi TF246017
+ TF246017:

+ TF246017: Team Foundation Server could not connect to the database. Verify that the server that is hosting the database is operational, and that network problems are not blocking communication with the server

- Một số chú ý khi thực hiện:
+ File TfsRestore.bat phải được chạy bằng quyền Admin
+ Khi chuyển database phải stop (dừng) server đó lại. Nếu không sẽ không cho copy

- Thực hiện


Gồm có 2 bước cơ bản là:
B1: Chuyển Database
- Đầu tiên stop server đang được dùng để cài Tfs lại

- Copy các file database của Tfs (.mdf, .log) ra
+ Tìm đường dẫn
+ Thực hiện copy và paste ra đâu đó như bình thường

- Atach database sang server mới

- Tạo tài khoản mới cho database của Tfs trên server mới này
+ Chú ý với winserver thì phải yêu cầu mật khẩu bảo mật cao (hoặc bỏ tích Enfoce Password Policy)


B2: Thiết lập lại Team Foundation
Chạy file TfsRestore.bat và làm theo hướng dẫn

+ Thu Muc Tfs = Thư mục cài Team Foundation Server. Mặc định là: C:\Program Files\Microsoft Team Foundation Server 11.0\Tools
+ Server name = Tên Server mới muốn chuyển Tfs đến
+ Database name = tên database gắn kết với Tfs (mặc định là Tfs_Configuration)
+ Tai Khoan = tài khoản tạo đề quản lí Tfs_Confition ở B1

Done


Có gì vướng mắc khi chuyển Tfs các bạn có thể comment hoặc liên hệ với mình. Chúc thành công! ^^

Nhận ngay 100$ cho VPS

Mua hàng ủng hộ page

Ủng hộ page

Nhãn

Code (45) Team Foundation Server (17) Database (14) News (14) product (13) toolbox (10) Linq (9) SoftDesign (8) XNA (6) API (5) Project (5) item (4)

- Bản quyền thuộc về Thư Viện WinForm - Giao diện: Metrominimalist - Thiết kế: Johanes Djogan -