我正在将DI引入我的MS MVC应用程序中,并且我无法从我的自定义Controller Factory中实例化控制器。似乎没有调用被覆盖的“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());
}
控制器工厂已实例化,但似乎它不用于解析Controller。我在'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);
}
答案 0 :(得分:1)
请参阅creating WindsorContainer results in type conversion error(不是完全相同的问题,但仍然是相同的答案)
答案 1 :(得分:0)
你可能遇到的另一个问题是这个电话:
AppDomain.CurrentDomain.GetAssemblies()
如果程序集实际上没有加载到AppDomain中,...将不会检索所有可用的控制器。 AppDomain在需要时加载程序集,因此如果您没有在代码中明确调用它们,则不会加载它们。