2009-04-06 41 views
9

Tôi nhận thấy rằng phần mở rộng MapRoute bao gồm quá tải chấp nhận tham số string [] được gọi là 'không gian tên'. Tôi đọc những gì Google đã cho tôi về nó, và được cho là điều này là để giúp khung tìm bộ điều khiển ở những nơi mà nó sẽ không nhìn khác.Mảng tên miền điều khiển ASP.Net MVC

Tôi đã thực hiện một số thao tác và thử đặt bộ điều khiển ở các vị trí lạ. Tôi đặt một trong thư mục Scripts; Tôi thậm chí đã xây dựng một trong một hội đồng riêng biệt với một không gian tên gốc riêng biệt.

Nếu không đặt bất kỳ tham số nào vào thông số không gian tên, mọi thứ đều hoạt động tốt. Nếu tôi chỉ đặt một trong các không gian tên trong param không gian tên, nó vẫn tìm thấy tất cả các bộ điều khiển của tôi. Tôi nghĩ có lẽ nó sẽ sử dụng mảng đó để phân biệt giữa các bộ điều khiển tương tự, nhưng điều đó cũng không xảy ra. Một HomeController trong MyProj.Controllers và một trong SomeOtherName.Stuff sẽ vẫn xung đột.

Vì vậy, câu hỏi của tôi là, thông số đó có bị phản đối không? Hay nó vẫn được sử dụng bằng cách nào đó mà tôi chưa phân biệt?

Trả lời

5

Ok, vì vậy sau khi thử nghiệm thêm, tôi đã tìm ra rằng nó không phải là một bộ lọc, chính xác, nhưng nó cũng là kinda. Tôi đã cho bạn 'trả lời' tín dụng mặc dù bạn đã sai một phần.

Vì vậy, sau khi tất cả, hành động giống như tôi nghĩ rằng nó nên được nói là nó làm thay đổi. Về cơ bản, dòng chảy logic là một cái gì đó như thế này:

  • Hãy tìm một không gian tên trong _cache phù hợp với một trong các không gian tên mảng
    • nếu đó là tìm thấy, tìm kiếm một bộ điều khiển của tên đúng
    • - nếu đó là tìm thấy, trả lại
    • - nếu nó không tìm thấy, trở lại tìm kiếm khắp mọi nơi khác mà nó muốn thường trông
  • nếu nó không tìm thấy, tìm kiếm tất cả trong đó lese

Vì vậy, trong ngắn hạn, tôi nghĩ rằng mảng không gian tên sẽ phân phối là chính xác.Lý do thử nghiệm đầu tiên của tôi trong vấn đề đó thất bại là nó chỉ thực hiện một kết hợp hoàn hảo, và tôi đã phạm sai lầm khi chỉ sử dụng root n/s từ assembly (nói cách khác, MyRoot thay vì MyRoot.Controllers).

Điều này không gian tên điều cho phép, sau đó, là để có một HomeController trong hai không gian tên khác nhau và phù hợp với họ một cách khác nhau tùy thuộc vào url hoặc params.

4

Không, giá trị không được dùng nữa. Nó được sử dụng trong DefaultControllerFactory.cs. Lưu ý rằng nếu giá trị được cung cấp, nó thay thế hoàn toàn các không gian tên chuẩn được tìm kiếm. Khi thông số không được cung cấp, các không gian tên được tìm kiếm của chúng tôi được xác định bởi:

HashSet<string> nsDefaults = new HashSet<string>(ControllerBuilder.DefaultNamespaces, StringComparer.OrdinalIgnoreCase); 

Khi tham số được cung cấp, danh sách bạn cung cấp sẽ thay thế giá trị này.

Trong cả hai trường hợp, DefaultControllerFactory gọi:

GetControllerTypeWithinNamespaces(controllerName, nsDefaults); 

... với danh sách, hoặc là một trong những bạn cung cấp, hoặc mặc định. Vì vậy, rõ ràng là giá trị được hỗ trợ.

Khi bạn xem mã nguồn ở đó và trong ControllerTypeCache, bạn có thể thấy mục đích thực của giá trị không gian tên: Nó không làm cho nhà máy điều khiển nhìn vào những nơi không nhìn khác; thay vì nó là một bộ lọc. Nói cách khác, nó ngăn chặn các nhà máy điều khiển mặc định từ tìm kiếm và tên không gian mà nó nếu không sẽ tìm kiếm các bộ điều khiển.

+0

Tôi nhận ra rằng đó là cách nó hoạt động, và tôi đã tìm được điểm tương tự mà bạn mô tả trong DefaultControllerFactory, nhưng khi tôi chạy các bài kiểm tra mô tả ở trên, đó không phải là cách nó hoạt động. Tôi đã cung cấp không gian tên không tồn tại và nhà máy vẫn tìm thấy bộ điều khiển của tôi. – Paul

+0

Mã trong ControllerTypeCache chắc chắn có vẻ như nó hoạt động theo cách đó với tôi. Bạn có thể gỡ lỗi thông qua nó bằng cách xây dựng với nguồn. Có lẽ có cái gì đó bạn đã không cung cấp? –

+0

Tôi đồng ý rằng nó trông như vậy, và tôi xây dựng w/nguồn khi thử nghiệm trước đây; Tôi sẽ thử lại w/một số thông số khác nhau. – Paul

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