2013-07-05 32 views
5

Công cụ: Mvc4, Máy chủ Sql, NhibernateMvc4: Kiến trúc bậc N

Tôi đang học kiến ​​trúc Ntier và lập kế hoạch để tìm hiểu điều này với một ví dụ nhỏ. Đây sẽ là một đơn đăng ký học sinh sẽ có một mẫu đơn cho a. tên đầu tiên b. họ: c. địa chỉ d. Id Học sinh Đơn đăng ký sẽ có thể a. Lấy học sinh theo Id b. Nhận tất cả học sinh c. Đăng ký học sinh mới/Lưu học sinh d. Chỉnh sửa một học sinh e. Xóa một sinh viên

tôi dự định có tầng sau

lớp Presentation (dự án riêng biệt MVC 4 ứng dụng)

--- html cho hình thức sinh viên tại đây. Tôi có thể sử dụng jquery etc tại đây --- bộ điều khiển của tôi sẽ gọi cho dịch vụ

Lớp dịch vụ (dự án riêng biệt: dự án thư viện lớp .Trong trường hợp này chỉ có web là khách hàng của tôi. Tôi sẽ học cách sử dụng webAPI hoặc wcf cho sau này trong một dự án khác)

--- StudentService đây

--- IstudentService đây

lớp kinh doanh: (riêng dự án: dự án thư viện lớp) ??

Lớp dữ liệu: (dự án riêng biệt: dự án thư viện lớp) ??

Cơ sở dữ liệu: (cơ sở dữ liệu máy chủ sql)

Bây giờ tôi đã nhầm lẫn và câu hỏi của tôi là: (? Mà lớp)

  1. nơi tôi sẽ tạo ra mô hình sinh viên của tôi

  2. gì sẽ Tôi đang viết trong lớp kinh doanh của tôi cho ví dụ sinh viên này tôi có.

  3. Điều gì sẽ xảy ra trong lớp dữ liệu của tôi? Tôi sẽ viết những phương pháp nào? Có phải chúng là phương pháp sẽ giao tiếp trực tiếp với cơ sở dữ liệu ?

    Một số ví dụ sẽ tuyệt vời. Tôi sẽ tìm một container IOC tốt.

Đây là mẫu mã bên dưới:

public interface IStudentService 

    { 
     IEnumerable<Student> GetStudents(); 

     Student GetStudentById(int id); 

     void CreateStudent(Student student); 

     void UpdateStudent(Student student); 

     void DeleteStudent(int id); 

     void SaveStudent(); 
    } 

public class StudentService : IStudentService 
    { 
     private DataContext _datacontext; 
     public StudentService() 
     { 
      _datacontext = new DataContext(); 
     } 

     public IEnumerable<Student> GetStudents() 
     { 
      var students = _datacontext.Students; 
      return students; 
     } 

     public Student GetStudentById(int id) 
     { 
      return _datacontext.Students.Find(id); 
     } 

     public void CreateStudent(Student student) 
     { 
      _datacontext.Students.Add(student); 
      _datacontext.SaveChanges(); 
     } 

     public void UpdateStudent(Student student) 
     { 
      _datacontext.Entry(student).State = EntityState.Modified; 
      //_datacontext.Entry(student).State = EntityState.Modified; 
      _datacontext.SaveChanges(); 
     } 

     public void DeleteStudent(int id) 
     { 
      var student = _datacontext.Students.Find(id); 
      _datacontext.Entry(student).State = EntityState.Deleted; 
      _datacontext.SaveChanges(); 
     } 

     public void SaveStudent() 
     { 
      _datacontext.SaveChanges(); 
     } 
    } 

Trả lời

1

Bạn cần phải có một cái nhìn vào Onion Architecture. Đó là một chút trong ngày về các phiên bản MVC, nhưng các tầng được xếp lớp rất nhiều.

Về container IoC, tôi khuyên bạn nên tìm kiếm trên Autofac - dễ sử dụng với nhiều tính năng, như đăng ký theo quy ước và đa đối tượng thuê.

Đối với câu hỏi của bạn:

Những gì tôi thường có là vào mẫu gửi, bộ điều khiển sẽ nhận được một StudentViewModel nộp, sau đó tôi sẽ chuyển nó sang một đối tượng Student và bàn giao cho IStudentRepository được tiêm vào bộ điều khiển. Và IStudentRepositry sẽ lưu nó vào DBContext. Giao diện kho lưu trữ sẽ nằm trong lớp Domain, nhưng việc thực hiện kho lưu trữ sẽ nằm trong lớp Data. Và DI container sẽ khớp với nhau.

Bí quyết ở đây là có tất cả các giao diện trong lớp Miền và triển khai ở mọi nơi. Và lớp miền không nên phụ thuộc vào bất kỳ lớp nào khác (đọc dự án miền sẽ không có tham chiếu đến dự án dữ liệu và web). Nhưng Web sẽ phụ thuộc vào các lớp Dữ liệu và Miền. Bạn chỉ cần phụ thuộc lớp dữ liệu trong lớp Web để cấu hình container IoC, vì lớp web là gốc tổng hợp của bạn, và IoC nên được cấu hình ở đó. Nhưng bạn không bao giờ nên sử dụng các đối tượng Dữ liệu trực tiếp trong bất kỳ hoạt động nào, bạn nên tiêm các giao diện cho các kho lưu trữ hoặc các dịch vụ.

Có rất nhiều điều đã được nói về kiến ​​trúc lớp, vì vậy hãy bắt đầu với Kiến trúc Onion trước, sau đó bạn sẽ có ý tưởng tốt hơn về những gì bạn cần.

+0

Tôi không chắc Kiến trúc Onion là một điều tốt cho một người nào đó vừa học, vì các bài viết khác nhau có xu hướng giả định rất nhiều kiến ​​thức. Tôi nghĩ rằng viêm khớp là một "bước thứ hai" tốt sau khi thực hiện một lớp 3 tầng truyền thống. –

+0

IoC container đã được đề cập, vì vậy tôi cho rằng một số mức độ kiến ​​thức. Tôi nhớ mình đã học được những điều này. Tôi đã làm một mớ hỗn độn của ứng dụng 3 lớp "cổ điển". Nhưng khi tôi đã thử OA, mọi thứ đã diễn ra đúng chỗ và tất cả đều diễn ra tốt đẹp. – trailmax

+1

Có, nhưng thực tế là bạn đã học được rất nhiều từ "mớ hỗn độn" khiến OA có ý nghĩa với bạn.Tôi cảm thấy rằng viêm khớp là rất nhiều "Làm điều này bởi vì tôi đã nói như vậy" nếu bạn chưa học được những vấn đề mà OA đề cập đến. –

2
  1. Bạn tạo mô hình trong lớp dữ liệu của mình. Bạn cũng sẽ tạo các mô hình trong tầng trình bày của mình (cho các kiểu xem của bạn). Bạn thường sẽ làm một số loại ánh xạ giữa mô hình dữ liệu của bạn và mô hình trình bày của bạn trong bộ điều khiển của bạn.

  2. Ứng dụng đơn giản thường không thực sự cần một lớp doanh nghiệp. Đặc biệt nếu ứng dụng của bạn chỉ lưu dữ liệu từ biểu mẫu vào bảng. Tuy nhiên, trong một ứng dụng như thế này bạn có thể làm những việc như "Bạn không thể đăng ký lớp này trừ khi bạn đã hoàn thành lớp đó" hoặc bạn có thể có "Bạn đã đăng ký nhiều lớp hơn bạn được phép" hoặc những gì không phải. Đây là những quy tắc kinh doanh phải được thực thi ở đâu đó và điều đó thường nằm trong lớp kinh doanh.

  3. Lớp dữ liệu của bạn có thể sẽ chỉ là mô hình Khung thực thể của bạn. Nó chỉ là mã của bạn để tải và lưu mô hình của bạn vào cơ sở dữ liệu.

Có nhiều thùng chứa IoC .. Tôi thích Ninject, nhưng những người khác giống như những người khác .. Thông thường, đây là vấn đề sở thích cá nhân.

Ở trên là cách bạn sẽ làm điều đó trong một ứng dụng đơn giản. Trong các ứng dụng phức tạp hơn, bạn cũng có thể có một mô hình trong lớp nghiệp vụ của mình. Tất cả phụ thuộc vào độ phức tạp của ứng dụng của bạn và liệu bạn có cần đại diện cho dữ liệu của mình ở cấp độ doanh nghiệp khác với cấp độ mô hình dữ liệu hay không. Ví dụ:

Ví dụ: bạn có thể có danh sách đối tượng doanh nghiệp trong lớp doanh nghiệp, nhưng các đối tượng này được thể hiện khác nhau trong lớp dữ liệu của bạn vì lý do hiệu suất. Nhưng tất cả điều này thực sự không phải là những điều bạn nên lo lắng về điểm này. Chỉ cần hiểu rằng khi các ứng dụng của bạn trở nên phức tạp hơn, bạn có thể cần phải làm những việc khác nhau.