2011-01-13 2 views
2

Я установил виндзорский замок в своем приложении mvc. все работает отлично, за исключением того, что он также ловит маршруты, имеющие тип ссылки или изображения. Проблема в том, что прямо перед выходом из контроллера и генерированием представления «GetControllerInstance» выполняется с типом «null». Это происходит в любое время там, где есть ссылка на странице, например:IoC Castle Windsor в проблеме маршрутизации MVC

<link rel="stylesheet" type="text/css" href="non-existing.css"/> 

Или ссылка на изображение, которого нет. Почему это происходит?

Мои окна Класс:

public class WindsorControllerFactory : DefaultControllerFactory 
{ 
    #region Constants and Fields 

    /// <summary> 
    /// The container. 
    /// </summary> 
    private readonly WindsorContainer container; 

    #endregion 

    // The constructor: 
    // 1. Sets up a new IoC container 
    // 2. Registers all components specified in web.config 
    // 3. Registers all controller types as components 
    #region Constructors and Destructors 

    /// <summary> 
    /// Initializes a new instance of the <see cref="WindsorControllerFactory"/> class. 
    /// </summary> 
    public WindsorControllerFactory() 
    { 
     // Instantiate a container, taking configuration from web.config 
     this.container = InversionOfControl.Container; 

     // Also register all the controller types as transient 
     IEnumerable<Type> controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes() 
              where typeof(IController).IsAssignableFrom(t) 
              select t; 
     foreach (Type t in controllerTypes) 
     { 
      this.container.AddComponentLifeStyle(t.FullName, t, LifestyleType.Transient); 
     } 
    } 

    #endregion 

    #region Methods 

    /// <summary> 
    /// The get controller instance. 
    /// </summary> 
    /// <param name="requestContext"> 
    /// The request context. 
    /// </param> 
    /// <param name="controllerType"> 
    /// The controller type. 
    /// </param> 
    /// <returns> 
    /// Resolved controller instance. 
    /// </returns> 
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     if (controllerType == null) 
     { 
      controllerType = typeof(HomeController); 
     } 

     return (IController)this.container.Resolve(controllerType); 
    } 

    #endregion 
} 

ответ

1

Это естественно. Несуществующее изображение или css не могут найти контроллер, но вы по умолчанию используете его для HomeController, в то время как этот контроллер не может обрабатывать статический контент.

Я не думаю, что вам нужно переопределить здесь. Пусть контроллер по умолчанию обрабатывает то, что он делает, и ресурс получит ошибку 404, если он не может быть найден, вместо этого вы вынуждаете его обслуживать этот контроллер.


Как я уже говорил, естественно, что тип является нулевым, если его невозможно найти. изменить его к этому:

if (controllerType == null) 
    { 
     return base.GetControllerInstance(requestContext, controllerType); 

    } 
+0

Я должен был добавить, если statment, потому что не делал так, разбивал мое приложение. Ошибка «ArgumentNullException», потому что Type имеет значение null (когда изображение не найдено). Я не думаю, что это должно произойти – ShaneKm

+0

см. Мое обновление, тогда .... – Aliostad

+0

теперь приложение выполняется отлично, за исключением отладки, я получаю это «Контроллер для пути /asdf.css» не найден или не реализует IController. " Это нормально? – ShaneKm

0

я обнаружил, что я должен был вернуть нуль, когда controllerType был нулевым. Приведение его к базовому классу привело к исключению. Ниже приведен рабочий код, который я использую.

public class DependencyControllerFactory : DefaultControllerFactory, IDisposable 
{ 
    protected readonly WindsorContainer _container; 

    public DependencyControllerFactory() 
    { 
     _container = new WindsorContainer(); 

     _container.Kernel.Resolver.AddSubResolver(new CollectionResolver(_container.Kernel)); 
     _container.Install(FromAssembly.This()); 
    } 

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     if (controllerType == null) 
     { 
      return null; 
     } 
     else 
     { 
      return (IController)_container.Resolve(controllerType); 
     } 
    } 

    public override void ReleaseController(IController controller) 
    { 
     _container.Release(controller); 
    } 

    public void Dispose() 
    { 
     _container.Dispose(); 
    } 
} 
Смежные вопросы