asp.net mvc đưa bộ điều khiển vào một dự án riêng biệt


107

Tôi chỉ đang học asp.net mvc và tôi đang cố gắng tìm ra cách chuyển các bộ điều khiển của mình vào một dự án riêng biệt. Điển hình là khi tôi đã thiết kế ứng dụng web asp.net trước đây, tôi đã tạo một dự án cho các mô hình của mình, một dự án khác cho logic của tôi, và sau đó là web.

Bây giờ tôi đang học asp.net mvc, tôi hy vọng sẽ làm theo một mô hình tương tự và đặt các mô hình và bộ điều khiển vào từng dự án riêng biệt của chúng và chỉ cần để lại các chế độ xem / script / css trên web. Phần mô hình rất dễ dàng, nhưng điều tôi không hiểu là làm thế nào để làm cho bộ điều khiển của tôi trong một dự án riêng biệt được "tìm thấy". Ngoài ra, tôi muốn biết nếu điều này được khuyến khích. Cảm ơn!

Câu trả lời:


92

Trước hết, chắc chắn nên đưa mô hình của bạn vào một dự án riêng biệt. Như bạn đã phát hiện ra, điều này thật tầm thường.

Về Bộ điều khiển và Chế độ xem, tôi không thấy bất kỳ lợi thế rõ ràng nào khi tách chúng ra cho hầu hết các dự án cơ bản, mặc dù bạn có thể có nhu cầu cụ thể để làm như vậy trong một ứng dụng cụ thể.

Nếu bạn chọn làm điều này, thì bạn sẽ cần cho khuôn khổ biết cách tìm bộ điều khiển của bạn. Cách cơ bản để làm điều này là cung cấp ControllerFactory của riêng bạn. Bạn có thể xem mã nguồn của DefaultControllerFactory để có ý tưởng về cách thực hiện điều này. Nhập con lớp này và ghi đè phương thức GetControllerType (string controllerName) có thể đủ để thực hiện những gì bạn đang yêu cầu.

Khi bạn đã tạo ControllerFactory tùy chỉnh của riêng mình, bạn thêm dòng sau vào Application_Start trong global.asax để cho khuôn khổ biết nơi tìm nó:

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());

Cập nhật: Đọc bài đăng này các bài đăng mà nó liên kết đến để biết thêm thông tin. Xem thêm bình luận của Phil Haack về bài đăng đó về:

ControllerBuilder.Current.DefaultNamespaces.Add(
    "ExternalAssembly.Controllers");

... không phải là một giải pháp hoàn chỉnh, nhưng có thể đủ tốt cho các trường hợp đơn giản.


2
Cảm ơn Craig! Đây chính xác là những gì tôi đang tìm kiếm. Thông tin này thậm chí còn tồn tại trên web? Tôi đã tìm kiếm mọi thứ trên Google mà không có nhiều may mắn. StackOverflow lại hoạt động!
Aaron Palmer

11
Tôi đồng ý, bộ điều khiển xử lý đầu vào của người dùng, thao tác mô hình, sau đó chuyển dữ liệu đến chế độ xem. Chúng thường rất cụ thể cho một ứng dụng. Bất kỳ logic nào không dành riêng cho ứng dụng có thể tốt hơn trong thư viện hoặc mô hình. Nhưng các bộ điều khiển nói chung phải đi kèm với dự án web.
Haacked

2
Tôi có bộ điều khiển lỗi và các chế độ xem giống hệt nhau giữa hai ứng dụng. Đối với tôi, thật hợp lý khi có những thứ đó trong một tập hợp duy nhất mà cả hai ứng dụng đều có thể sử dụng.
Sailing Judo

3
Há chẳng phải dễ dàng để kiểm tra các bộ điều khiển và sử dụng IoC khi điều khiển đang ở trong một dự án riêng biệt - đó sẽ là nguyên nhân chính
Samuel G

1
@Chev, tôi không nghĩ nó tạo ra bất kỳ sự khác biệt nào ở đó. Khả năng kiểm tra của bộ điều khiển của bạn liên quan nhiều hơn đến cách bạn mã hóa chúng , chứ không phải nơi chúng sống.
Craig Stuntz

19

Mặc dù việc tạo ControllerFactory của riêng bạn là hợp lý, tôi thấy thuận tiện hơn khi xác định tất cả các Bộ điều khiển của tôi trong mỗi dự án, nhưng lấy chúng từ Bộ điều khiển trong dự án Chia sẻ của tôi:

namespace MyProject1.Controllers
{
   public class MyController : MySharedProject.Controllers.MyController
   {
      // nothing much to do here...
   }
}

namespace MySharedProject.Controllers
{
   public abstract class MyController : System.Web.Mvc.Controller
   {
      // all (or most) of my controller logic here...
   }
}

Điều này có lợi ích bổ sung là bạn có một nơi để đặt logic Bộ điều khiển của mình khác nhau giữa các dự án. Ngoài ra, các nhà phát triển khác sẽ dễ dàng tìm thấy logic Bộ điều khiển của bạn hơn vì Bộ điều khiển tồn tại ở vị trí tiêu chuẩn.

Về việc liệu điều này có được khuyến khích hay không, tôi nghĩ là hoàn toàn có. Tôi đã tạo một số logic Quản lý tài khoản phổ biến mà tôi muốn chia sẻ giữa các dự án có logic nghiệp vụ rất khác nhau. Vì vậy, tôi đang chia sẻ Tài khoản và Bộ kiểm soát quản trị viên của mình, nhưng các Bộ kiểm soát khác dành riêng cho các dự án tương ứng của họ.


1
Điều này làm việc rất tốt, nhưng tôi đã phải loại bỏ một số mã dư thừa để ngăn chặn một lỗi định tuyến
Ken Mc

Xin chào, Làm cách nào để quản lý định tuyến trong loại dự án này? tôi muốn sử dụng định tuyến thuộc tính ...
محمد

Bạn có thể sử dụng định tuyến thuộc tính giống như cách bạn làm bình thường.
ThisGuy

2
Tôi nghĩ không chắc tại sao điều này lại không có nhiều ủng hộ hơn ... thanh lịch hơn nhiều so với câu trả lời được chấp nhận. Cảm ơn!
jleach

Điều này không làm việc cho tôi. Bạn có thể cho biết đây là .Net Core hay .Net Framework?
Homayoun Behzadian

4
  • Thêm Thư viện Lớp cho dự án mvc của bạn.
  • Trong lớp thêm mã sau (Đối với mã Bộ điều khiển u'r)

    namespace ContactController
    {
    public class ContactController : Controller
    {
        public ActionResult Call()
        {
            ViewBag.Title = "Inside MyFirst Controller.";
            return View();
        }
    }

    }

  • Trên thư mục xem dự án mvc, hãy thêm thư mục cho Liên hệ và tạo tệp Call.cshtml. Xem thư mục

  • Thêm tham chiếu dự án thư viện lớp vào dự án MVC chính của bạn.

Tài liệu tham khảo

  • Cuối cùng để tham chiếu không gian tên bộ điều khiển liên hệ vào Cấu hình Định tuyến.

RouteConfig


3
Điều đó hơi đáng tiếc khi bạn có không gian tên trùng tên với bộ điều khiển.
Mariusz Jamro

3

Vấn đề của tôi đã được giải quyết sau khi tôi cập nhật System.Web.Mvctham chiếu NuGet để MvcWebsite và Thư viện lớp sử dụng cùng một System.Web.Mvcphiên bản

Không cần thêm không gian tên mặc định


Vấn đề là MvcWebsite không ném ngoại lệ khi MVC hiện lắp ráp có phiên bản thấp hơn MVC tham chiếu lớp thư viện của lắp ráp
Homayoun Behzadian

1

Hình thức tách đơn giản nhất mà tôi sử dụng là giữ lại các Chế độ xem "nguyên trạng" trong dự án MVC ban đầu nhưng loại bỏ Bộ điều khiển. Sau đó, trong một dự án ClassLibrary mới, hãy thêm các lớp Controller và đảm bảo chúng kế thừa từ Controller.

Công cụ định tuyến MVC sẽ tự động định tuyến đến Bộ điều khiển trong ClassLibrary và Bộ điều khiển sẽ tự động xây dựng các Chế độ xem từ dự án MVC ban đầu, miễn là bạn có các tài liệu tham khảo và sử dụng đúng cách.

Tôi đang sử dụng kiến ​​trúc này để triển khai mô-đun Báo cáo Html có thể được biên dịch và triển khai riêng biệt với giải pháp chính. Cuối cùng, tôi không có SSRS!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.