Asp.net mvc MVC路由问题中的IoC-Castle-Windsor
我已经在mvc应用程序中设置了castle windsor。除了捕捉链接或图像类型的路由外,其他一切都很好。问题是,在退出控制器并生成视图GetControllerInstance之前,使用“null”类型执行。只要页面上有如下链接,就会发生这种情况:Asp.net mvc MVC路由问题中的IoC-Castle-Windsor,asp.net-mvc,castle-windsor,asp.net-mvc-routing,Asp.net Mvc,Castle Windsor,Asp.net Mvc Routing,我已经在mvc应用程序中设置了castle windsor。除了捕捉链接或图像类型的路由外,其他一切都很好。问题是,在退出控制器并生成视图GetControllerInstance之前,使用“null”类型执行。只要页面上有如下链接,就会发生这种情况: <link rel="stylesheet" type="text/css" href="non-existing.css"/> 或指向不存在的图像的链接。为什么会这样 我的windows类: public class Wi
<link rel="stylesheet" type="text/css" href="non-existing.css"/>
或指向不存在的图像的链接。为什么会这样
我的windows类:
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
}
这是很自然的。不存在的图像或css找不到控制器,但您将其默认设置为HomeController,而此控制器无法处理静态内容 我认为你不需要在这里设置超控。让默认控制器处理它所做的事情,如果找不到资源,则资源将得到404错误,而不是强制该控制器为其提供服务 正如我所说的,如果找不到类型,则类型自然为null。 将其更改为:
if (controllerType == null)
{
return base.GetControllerInstance(requestContext, controllerType);
}
我发现当controllerType为null时,我必须返回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();
}
}
我必须添加if station,因为不这样做会使我的应用程序崩溃。错误ArgumentNullException,因为找不到映像时类型为null。我认为这不应该发生在应用程序运行正常的情况下,除非在调试中,我发现路径“/asdf.css”的控制器未找到或未实现IController。这正常吗?是的,只要在fiddler中你看到请求得到404作为响应。好的,但这不是CSS,而是主页,对吗?在这种情况下,您的路线有问题。好的,太好了!很高兴听到这个消息。