IoC Castle Windsor в проблеме маршрутизации MVC - PullRequest
2 голосов
/ 13 января 2011

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

<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
}

Ответы [ 2 ]

1 голос
/ 13 января 2011

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

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


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

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

    }
0 голосов
/ 02 октября 2013

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

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();
    }
}
...