2010-10-01 31 views
5

Khi xây dựng các ứng dụng phức tạp, bộ điều khiển có thể bắt đầu trở nên khó sử dụng và rất lớn, điều này có nghĩa là bạn tách chúng ra thành các bộ điều khiển riêng biệt. Điều này có thể không phù hợp vì nó sẽ được phản ánh trong trải nghiệm người dùng. I E. Họ sẽ thấy tên bộ điều khiển trong URI.Cấu trúc của các thư mục điều khiển Asp.net MVC để gắn kết tốt hơn

Ví dụ: Dự án mặc định mà tàu với MVC có AccountController, có những hành động để đăng nhập, đăng xuất, đăng ký vv .. mà dường như vi phạm các Single Responsibility Principle.

Vậy câu hỏi là làm thế nào để giải quyết vấn đề này và tách ra các mối quan tâm? Một phản ứng ban đầu có thể chỉ là tạo các bộ điều khiển riêng biệt. I E.

AccountLoginController 

AccountRegisterController 

Nhưng đây không phải là trải nghiệm tuyệt vời từ quan điểm của khách hàng vì nó sẽ ảnh hưởng đến URI khi yêu cầu tài nguyên.

Một giải pháp có thể là có các thư mục riêng biệt cho mỗi bộ điều khiển chứa các tệp lớp riêng biệt cho hành động, mỗi tệp có một trách nhiệm như vậy.

Controllers (folder) 
    Account (folder) 
     Register.cs 
     Login.cs 
     Logout.cs 
    AnotherController (folder) 
     Actionfile.cs 
     Actionfile.cs 

Ở trên sẽ tách riêng chức năng và là highly cohesive.

Vì vậy, đây là một lời giải thích dài, nhưng câu hỏi của tôi là ..

  • Có ai thực hiện điều này trước đây chưa?

  • Nếu bạn làm cách nào để tìm hiểu?

  • Suy nghĩ của bạn về mẫu này là gì?

+1

Tại sao lại nhấn mạnh vào URI? Hầu hết người dùng (99% +) sẽ không quan tâm đến bất kỳ điều gì sau ".com". Tại sao nó lại quan trọng nếu nó là '/ Account/Register' hoặc'/AccountRegister'? Tôi thấy nó vui nhộn.devs net đã không đưa ra một shit về URIs cho đến khi mọi hướng dẫn MVC đặt tuyến đường như bước 1. Bạn đã từng đến ebay hay Amazon? Những URI đó thật kinh khủng, nhưng chúng vẫn là những trang web thành công. Bạn biết tại sao mà? Bởi vì họ quan tâm đến trải nghiệm người dùng. Tôi dành thời gian của tôi lo lắng về trải nghiệm người dùng trên trang web thực tế (chức năng, bố cục, điều hướng menu, v.v) so với những gì người dùng nhìn thấy trong thanh địa chỉ./rant – Ryan

+3

@Ryan Tôi không hiểu ý kiến ​​đóng góp của bạn như thế nào? Nói rằng .net devs "... đã không đưa ra một shit về URI cho đến khi ..." chỉ là một ý kiến ​​đầu cơ và không thực sự đúng sự thật. Hơn nữa, câu hỏi này không ảnh hưởng đến URI mà là một câu hỏi về tách mối quan tâm, SRP và sự gắn kết liên quan đến các quy ước được thiết lập bởi khuôn khổ ASP.NET. –

Trả lời

2

Điều đó tùy thuộc vào ý bạn là trách nhiệm duy nhất.

Nếu bạn có nghĩa là Xác thực là trách nhiệm, thì bộ điều khiển hộp hoàn hảo chỉ như cách thực hiện. Đăng nhập, Đăng xuất và Đăng ký là tất cả các phần của cùng một thứ - Xác thực. Vì vậy, nó có ý nghĩa rằng mã của họ là trong cùng một bộ điều khiển.

Nếu bạn thực hiện nguyên tắc trách nhiệm duy nhất với cực kỳ vô lý, bạn sẽ không bao giờ có nhiều hơn các lớp đơn lẻ với một hàm duy nhất trong một tệp duy nhất.

Bạn phải tìm sự cân bằng giữa khả năng đọc/khả năng bảo trì so với chia tách mối quan tâm. Trong trường hợp này, nó sẽ đi quá xa. Ngoài ra, hãy nhớ rằng MVC là tất cả về Convention over Configuration, có nghĩa là nếu bạn đặt tên cho bộ điều khiển và chế độ xem theo quy ước thì chúng sẽ có thể phát hiện được và bạn sẽ gặp ít vấn đề định cấu hình và định tuyến hơn. Có nói rằng, nếu bạn được xác định là có quy ước đặt tên bộ điều khiển phi quy ước, do đó, để nói, bạn có thể triển khai mã khám phá Bộ điều khiển của riêng bạn, cho phép bạn sử dụng một quy ước khác. Từ bài viết được liên kết ở trên:

public class ControllerConvention : TypeRules, ITypeScanner { 
    public void Process(Type type, PluginGraph graph) { 
    if (CanBeCast(typeof (IController), type)) { 
    string name = type.Name.Replace("Controller", "").ToLower(); 
     graph.AddType(typeof(IController), type, name); 
    } 
    } 
} 
+1

+1 - Trách nhiệm gắn kết và duy nhất của bạn là khá chủ quan. IMHO người hỏi đang theo đuổi một mô hình giấc mơ khi cách hiện tại ASP.NET MVC được tổ chức ra là khá tương tự như tất cả các thực hiện MVC khác ra khỏi đó. Khi bạn đi xa khỏi con đường của bạn, hoặc là một thiên tài hoặc hoàn toàn điên rồ. Cuộc gọi của bạn. ;) – jfar

3

Bạn có xem Areas không?

"Các khu vực cho phép bạn sắp xếp một dự án lớn thành nhiều phần nhỏ hơn để quản lý sự phức tạp của một ứng dụng web lớn. nhóm bộ điều khiển và chế độ xem có liên quan. "

Tóm lại, một khu vực là một thư mục trong dự án của bạn có các thư mục con riêng cho bộ điều khiển, mô hình và chế độ xem.

0

Công ước về cấu hình khá tiện lợi để giúp mọi thứ đứng lên nhanh chóng hoặc cho các ứng dụng back-end nơi URI không quan trọng trong một thời gian dài. Nhưng đối với bất kỳ trang web công khai nào tôi đã thực hiện trên MVC, không có các lộ trình dựa trên quy ước được xuất bản bằng một số lý do:

  • url của bạn là API của bạn. Bạn nên kiểm soát chúng và biết bạn đang xuất bản ở đâu.
  • Tôi là một chút về phía hoang tưởng và tôi không thích khả năng của công cụ rò rỉ vào ứng dụng của tôi thông qua url skullduggery.

Định tuyến tùy chỉnh cũng cho phép bạn thực hiện những việc như có/Foo chuyển đến cả FooFooController và FooBarController tùy theo hành động. Bạn thậm chí có thể tận dụng lợi thế của các khu vực và không phải hiển thị chúng cho mọi người.

+1

Tôi hiểu quan điểm của bạn nhưng tôi đã tìm thấy với các dự án MVC lớn hơn, điều ngược lại sẽ được áp dụng. Lớn hơn họ nhận được, tôi càng đánh giá cao các quy ước khi họ giúp ngăn ngừa các vấn đề chính. –

0

Bạn làm cho một điểm tốt, nhưng tôi nghĩ sự nhầm lẫn ở đây là những gì một bộ điều khiển thực sự là. Trong một mẫu MVC, bộ điều khiển của bạn có thể được coi là một không gian tên cho một nhóm các phương thức hành động.

Hãy sử dụng không gian tên "Hệ thống" của .NET làm ví dụ. "System.Data" và "System.Core" có hai trách nhiệm rất khác nhau, nhưng được nhóm lại theo trình bao bọc "Hệ thống".

Khi truy cập hành động của bộ điều khiển, bạn thường sẽ sử dụng định tuyến như {controller}/{action}.

Phần "Tài khoản" của "AccountController" ánh xạ tới {controller} và các phương thức trong bản đồ "AccountController" thành {action}.

Tôi khuyên bạn nên xây dựng một thư viện lớp để xử lý logic nghiệp vụ và định tuyến các hành động của bạn tới thư viện này. Bạn có thể xây dựng các lớp của bạn chính xác như bạn đã nói ở trên, chuyển các giá trị được định tuyến của các hành động của bạn đến thư viện và trả về một mô hình cho các khung nhìn của bạn.

Register.cs có thể là lớp tĩnh mà bạn sẽ gọi từ phương thức hành động của mình trong AccountController.

Ví dụ:

"/ tài khoản/đăng ký" ->

Bộ điều khiển:

public class AccountController : Controller 
{ 
    public ActionResult Register() 
    { 
     return View("Register", Register.RegisterUser()); 
    } 
} 

khiển Logic:

public static class Register 
{ 
    public static RegisterModel RegisterUser() 
    { 
     // Handle application logic here and build your model 
     return new RegisterModel() { PasswordLength = 12 }; 
    } 
} 

mẫu:

public class RegisterModel 
{ 
    public int PasswordLength { get; set; } 
} 
Các vấn đề liên quan