2009-04-05 35 views
27

Gần đây tôi đã cố gắng thực thi việc tiêm phụ thuộc bằng cách sử dụng StructureMap. Tôi quản lý để làm theo các ví dụ tất cả các cách nhưng tôi gặp phải một ngoại lệ ném mỗi khi tôi cố gắng để chạy các ứng dụng. Dưới đây là một số đoạn mã từ nhà máy điều khiển của tôi.Custom Controller Factory, Dependency Injection/Các vấn đề về cấu trúc với ASP.NET MVC

public class StructureMapControllerFactory : DefaultControllerFactory 
{ 
    protected override IController GetControllerInstance(Type controllerType) 
    { 
     if (controllerType == null) 
      throw new ArgumentNullException("controllerType"); 

     return ObjectFactory.GetInstance(controllerType) as Controller; 
    } 
} 

My Global.asax gọi một lớp bootstrapper tĩnh mà đăng ký tất cả các phụ thuộc của tôi, nhưng có vẻ như GetControllerInstance của StructureMapControllerFactory là nhận được gọi là hai lần. Lần đầu tiên nó được gọi, một controllerType thích hợp được truyền vào nhưng nó luôn luôn là null trong lần gọi thứ hai.

Lần đầu tiên GetControllerInstance được gọi, loại được đặt thành HomeController đúng. Mã lửa trong HomeController và nó trả về View(). Trên sự trở lại của View(), sự kiện Page_Load được gọi trên tệp aspx. Sau khi bước qua đó, nó đến một dòng:

httpHandler.ProcessRequest (HttpContext.Current);

Đó là nơi mà GetControllerInstance được gọi là lần thứ hai.

Dưới đây là bit Global.asax của tôi mà có thể liên quan:

protected void Application_Start() 
    { 
     RegisterRoutes(RouteTable.Routes); 

     Bootstrapper.ConfigureStructureMap(); 

     ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory()); 
    } 

Tôi rất mong muốn được làm việc dependency injection và sẽ được đánh giá cao nhất nếu có ai có thể giúp tôi ra ngoài. :)

+1

Dude, tôi cũng gặp vấn đề tương tự. – Micah

+0

Làm cách nào để bạn đăng ký bộ điều khiển? – Sebastian

+0

Mô tả sự cố tốt. –

Trả lời

45

CẬP NHẬT Lý do điều này xảy ra là khi hình ảnh được chỉ định trong tệp css và hình ảnh đó thiếu khung định tuyến cố gắng ánh xạ url tới bộ điều khiển. Bỏ qua các tuyến đường như được liệt kê bên dưới sẽ ngăn chặn lỗi xảy ra, nhưng tôi quyết định không triển khai nó vì đó là cách hay để được thông báo rằng bạn có tài nguyên bị thiếu.

Bạn có thể xem giải thích chi tiết cùng với các ví dụ về thiết lập tiêm phụ thuộc bằng Bản đồ cấu trúc here.

Tôi đã gặp vấn đề tương tự và tôi nghĩ rằng tôi đã tìm ra. Vì bất cứ lý do gì bất cứ khi nào bạn cố gắng cung cấp cho nhà máy điều khiển của riêng bạn, bạn cần thêm một vài định nghĩa IgnoreRoute bổ sung. Điều đầu tiên tôi sẽ làm là thêm dòng này vào phương pháp GetControllerInstance của bạn:

if(controllerType == null) 
    return base.GetControllerInstance(controllerType) 

này ít nhất sẽ cung cấp cho bạn thêm thông tin trong thông báo lỗi như những gì được yêu cầu là gây ra controllerType là null. Trong trường hợp đặc biệt của tôi, tôi đã có một hình nền trong file css của tôi thiết lập như thế này:

background: url(img/logo.gif); 

Vì vậy, những gì xảy ra là định tuyến đang tìm kiếm một bộ điều khiển được gọi là "img" và một hành động mà mất logo.gif hoặc cái gì đó dọc những dòng đó. Đó rõ ràng không phải là hành vi đúng.

Sau một số lần đào, tôi nhận ra rằng tôi cần thêm định nghĩa IgnoreRoute vào Global của mình.tập tin tuyến Asax rằng sẽ bỏ qua bất cứ điều gì trong "nội dung" thư mục của trang web của tôi như thế này:

routes.IgnoreRoute("{Content}/{*pathInfo}"); 

Tôi vẫn không chắc chắn lý do tại sao bạn không cần phải làm điều này với ControllerFactory mặc định, nhưng dù sao nó hoạt động.

Có thể bạn sẽ gặp vấn đề tương tự với favicon.ico. Đặc biệt nếu bạn sử dụng google crhome. Bạn cũng cần phải thêm phần này:

routes.IgnoreRoute("{*favicon}", new {[email protected]"(.*/)?favicon.ico(/.*)?"}) 
+0

cảm ơn, đây có lẽ là lý do, sẽ báo cáo lại khi tôi đang ở nhà – kitsune

+1

Tôi đã gặp vấn đề tương tự với một Windsor ControllerFactory. Cảm ơn bạn đã sửa chữa, nó hoạt động rất tốt. –

+0

+ 1 cho nền: url (img/logo.gif); Lỗi của tôi là tôi đang sử dụng giao diện người dùng JQuery và chưa bao gồm các tệp hình ảnh. Tôi chỉ sử dụng một phần nhỏ chức năng và không nhận ra hình ảnh mà tôi cần - các vòng lặp! – ozz

4

Tôi đoán bạn đang yêu cầu tệp tĩnh, chẳng hạn như tệp javascript, chưa được thêm vào dự án của bạn hoặc có lẽ tham chiếu đến tệp có lỗi đánh máy. Bạn nên theo dõi các yêu cầu web của trình duyệt của mình và tìm các yêu cầu web để không giải quyết chính xác một tệp tĩnh khi cần. Bạn có thể sử dụng firebug trong FF hoặc fiddler nếu bạn đang sử dụng IE để làm điều này.

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