2009-09-16 19 views
11

Tôi đang sử dụng Castle Windsor để quản lý các trường hợp bộ điều khiển (trong số những thứ khác). máy điều khiển của tôi trông như thế này:Tại sao bộ điều khiển GetControllerInstance của Castle Windsor của tôi được gọi với giá trị null?

public class WindsorControllerFactory : DefaultControllerFactory 
    { 
     private WindsorContainer _container; 

     public WindsorControllerFactory() 
     { 
      _container = new WindsorContainer(new XmlInterpreter()); 

      var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes() 
            where typeof(Controller).IsAssignableFrom(t) 
            select t; 

      foreach (Type t in controllerTypes) 
      { 
       _container.AddComponentLifeStyle(t.FullName, t, LifestyleType.Transient); 
      } 
     } 

     protected override IController GetControllerInstance(Type controllerType) 
     { 
      return (IController)_container.Resolve(controllerType); // ArgumentNullException is thrown here 
     } 

Khi tôi khởi động ứng dụng ASP.Net MVC của tôi và cố gắng đi đến "/" (hoặc đường dẫn khác), tôi nhận được một ArgumentNullException. Tôi đặt một điểm break vào mục nhập của GetControllerInstance và thấy rằng nó được gọi là một lần với HomeController của tôi, sau đó một lần thứ hai với null (đó là khi ngoại lệ được ném). Tại sao nó lại được gọi lại?

Tôi có nên thay đổi phương thức để một cái gì đó như thế này:

protected override IController GetControllerInstance(Type controllerType) 
{ 
    if (controllerType == null) 
     return null; 

    return (IController)_container.Resolve(controllerType); 
} 
+0

Tại sao bạn hack đăng ký với sự phản ánh thay vì sử dụng API đăng ký phù hợp? –

+0

@Krzysztof - Tôi đang theo dõi ví dụ của Steve Sanderson. Nếu bạn muốn đăng một cách tốt hơn để đăng ký tất cả các lớp kế thừa từ bộ điều khiển, hãy làm như vậy. – scottm

Trả lời

24

Nó chỉ ra rằng yêu cầu thứ hai là khung MVC cố gắng tìm một kịch bản tôi bao gồm trong Site.Master. Đường dẫn không tồn tại, vì vậy tôi đoán nó đã cố gắng giải quyết một bộ điều khiển (phù hợp với /Scripts/sitescripts.js). Tôi đã thay đổi phương thức này thành:

protected override IController GetControllerInstance(Type controllerType) 
{ 
    if (controllerType != null) 
    { 
     return (IController)_container.Resolve(controllerType); 
    } 
    else 
    { 
     return base.GetControllerInstance(controllerType); 
    } 
} 

Và ngoại lệ với một thông điệp dễ hiểu đã được ném.

+1

Cảm ơn, tôi đã dành hàng giờ tìm kiếm giải pháp này. – Geo

+0

Cảm ơn, đã giúp tôi. –

+1

Và tôi ba. Chỉ cần lưu ý, đối với MVC 2.0, đây là cơ sở trả về.GetControllerInstance (requestContext, controllerType); – Gabe

4

có vấn đề này khi sau cuốn sách Pro ASP.NET MVC Framework, thêm

routes.IgnoreRoute ("favicon.ico");

vào các tuyến đường trong tệp global.asax.cs và nó hoạt động. Xem thêm tại đây: serving favicon.

+0

Có cùng vấn đề với người hỏi câu hỏi và trong khi xử lý lỗi tốt hơn là một ý tưởng hay thì vấn đề thực tế là trang đang tải và sau đó để tìm favicon. Thêm dòng bên trên đã giải quyết vấn đề của tôi ngay lập tức. – colethecoder

+0

@colethecoder Vui vì nó đã giúp –

3

về đăng ký của tất cả các bộ điều khiển bạn thường muốn làm điều đó như thế này:

container.Register(
    AllTypes.FromThisAssembly() 
     .BasedOn<IController>() 
     .Configure(c => c.Lifestyle.Transient) 
); 

Xem the documentation cho lời giải thích chi tiết của API.

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