2012-03-13 35 views
13

Có thể tạo một lớp một phần cho bộ điều khiển trong MVC không?Một phần lớp cho bộ điều khiển

Lý do: Tôi có bộ điều khiển chứa quá nhiều mã. Bộ điều khiển này chứa mã cho các báo cáo khác nhau và do quá nhiều mã, nó làm giảm khả năng đọc của mã. Tôi muốn giữ cho tên bộ điều khiển giống nhau cho tất cả các báo cáo vì vậy tôi muốn phân phối mã cho các báo cáo khác nhau.

Nếu tôi có thể làm bất kỳ cách nào khác ngoài việc cho tôi biết.

Cảm ơn Alok Shah

Trả lời

13

Có bạn có thể sử dụng một lớp học phần - trình biên dịch chỉ kết hợp tất cả chúng lên một thời gian biên dịch để tạo ra một.

Tuy nhiên, bạn đề cập đến bạn muốn 'phân phối' mã - nếu mã là để đi vào nhiều dự án thì partials sẽ không giúp đỡ. Thay vào đó bạn có thể tạo các lớp bộ điều khiển cơ sở (kế thừa từ System.Web.Mvc.Controller trong một dự án thư viện lớp, với các phương thức hành động cần thiết, và sau đó chỉ cần sử dụng định tuyến để định tuyến các url tương tự đến các bộ điều khiển khác nhau. Tôi hightly khuyên bạn nên xem xét thông qua phần còn lại của hướng dẫn nếu có những khía cạnh cốt lõi khác của MVC bạn không chắc chắn về nó.Không bao gồm tất cả mọi thứ, nhưng nó làm những điều cơ bản. sau đó, bạn có thể tạo các điểm mở rộng thông qua các phương thức ảo, vv nếu có các phần tử của những báo cáo này mà các ứng dụng web khác nhau có thể cần phải tùy chỉnh.

Vì vậy "Reports/Customers" thể đường đến một CustomerReportsController"Reports/Orders" thể đường đến một OrdersReportsController:

routes.MapRoute("CustReports", 
    "Reports/Customers/{action}", 
    new { controller = "CustomerReports", action = "Index", id = "" }); 

routes.MapRoute("OrderReports", 
    "Reports/Orders/{action}", 
    new { controller = "OrdersReports", action = "Index", id = "" }); 

Đây là phương pháp đơn giản nhất cho vấn đề này - nhưng tôi nghĩ rằng sử dụng Areas (liên kết là để MSDN hương) sẽ nhất cũng có thể được áp dụng, trong trường hợp đó bạn có thể không cần phải sử dụng định tuyến ở tất cả vì tuyến đường mặc định có thể sẽ làm tất cả.

+0

+1, ý tưởng hay !! –

+0

@Andras: Tôi có thể có một số mã mẫu hoặc liên kết tham chiếu cho nó không? Tôi chưa bao giờ định tuyến tùy chỉnh nên tôi không có bất kỳ ý tưởng nào về nó. –

+0

@alok_dida đã cập nhật. –

6

Tất nhiên!

Các lớp học một phần là một tính năng của ngôn ngữ C# và không có liên quan gì đến MVC hoặc bất kỳ khung công tác nào khác mà bạn có thể đang sử dụng.

+0

.. Điều đó có nghĩa là tôi có thể tạo các lớp học một phần cũng cho Bộ điều khiển. Đúng? –

+2

Điều này là chính xác :) –

0

Có. Các lớp một phần thực sự chỉ là một tính năng của ngôn ngữ, và lớp được biên dịch là một lớp .NET thông thường giống như bất kỳ lớp nào khác.

tôi sẽ đề nghị rằng mặc dù bạn chia bộ điều khiển thành nhiều điều khiển, bảo đảm tách biệt thích các mối quan tâm (có một lớp học mà là quá lớn bạn cần phải tách nó ra thành nhiều file sẽ chắc chắn smell bad.)

0

" Nếu tôi có thể làm bất cứ cách nào khác hơn là làm cho tôi biết"

làm thế nào về:

  • Tóm tắt đi 'làm' phần để máy phát điện báo cáo khác nhau cho các loại báo cáo riêng biệt, tất cả đều phù hợp với một giao diện . Các trình tạo báo cáo này sẽ là các lớp nằm ngoài lớp MVC của ứng dụng.
  • Làm sạch bộ điều khiển sao cho các phụ thuộc (Trình tạo báo cáo) được tiêm vào hàm tạo, sử dụng Ninject, StructureMap hoặc Castle Windsor
  • Dọn sạch tất cả mã tạo báo cáo ra khỏi bộ điều khiển và triển khai thực hiện cụ thể của Báo cáo máy phát điện abstractions

Sau đó, bạn sẽ không cần chia bộ điều khiển thành các lớp riêng biệt. Nhược điểm là điều này sẽ mất một lượng thời gian hợp lý để khái niệm hóa và thực hiện, nhưng bạn sẽ kết thúc với một codebase tốt hơn.

+0

Tôi không thể bắt kịp với bạn. Bạn có thể vui lòng cung cấp cho tôi một số mã mẫu hoặc ứng dụng mẫu không? –

+0

Khó khăn ở đây là trong khái niệm hóa - tôi không thể cung cấp cho bạn một ứng dụng mẫu, nhưng tôi có thể chỉ cho bạn một lời giải thích hợp lý và ví dụ về rất nhiều những gì tôi đã mô tả (bằng ngôn ngữ tốt hơn) http://www.mikesdotnetting.com/Article/117/Dependency-Injection-and-Inversion-of-Control-with-ASP.NET-MVC – SpaceBison

Các vấn đề liên quan