【发布时间】:2010-12-01 22:15:44
【问题描述】:
我正在将 DI 引入我的 MS MVC 应用程序,但我无法从我的自定义控制器工厂中实例化控制器。似乎没有调用覆盖的“GetControllerInstance”。
谁能告诉我我错过了什么?
我的控制器工厂:
public class WindsorControllerFactory : DefaultControllerFactory
{
public WindsorControllerFactory()
{
var controllerTypes = from t in AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes())
where typeof (IController).IsAssignableFrom(t)
select t;
foreach (Type controllerType in controllerTypes)
{
ApplicationContainer.Container.AddComponentLifeStyle(controllerType.FullName, controllerType,
LifestyleType.Transient);
}
}
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
if(controllerType !=null)
{
return (IController) ApplicationContainer.Container.Resolve(controllerType);
}
return base.GetControllerInstance(requestContext, controllerType);
}
}
}
Application_Start:
ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory());
}
控制器工厂已实例化,但它似乎不用于解析控制器。我在“GetControllerInstance”上放置了一个断点,但它从未被命中。
结果是没有为此对象定义无参数构造函数。抛出异常
更新:
我将 GetControllerInstance 更改为:
private WindsorContainer _container;
public WindsorControllerFactory(WindsorContainer container)
{
_container = container;
_container.Register(AllTypes.Of<IController>().FromAssembly(
typeof(BaseFactoryController).Assembly).Configure(
c => c.Named(c.Implementation.Name.ToLowerInvariant()).LifeStyle.Transient));
}
现在我必须忽略 null controllerType ?!如果没有评论:
//base.GetControllerInstance(requestContext, controllerType);
它开始将我的 .js 文件视为控制器。抛出httpException
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
{
return null;
}
//base.GetControllerInstance(requestContext, controllerType);
return (IController) _container.Resolve(controllerType);
}
【问题讨论】:
-
关于把js当作控制器,同样的问题,同样的推荐stackoverflow.com/questions/1598421/…
标签: asp.net-mvc castle-windsor ioc-container