【发布时间】:2015-02-13 09:50:01
【问题描述】:
我有一个 MVC 5 项目并使用 Unity 框架进行依赖注入。一切正常,但突然出现以下错误
“IControllerFactory 'App.Web.Models.UnityControllerFactory' 没有返回名称为 'School' 的控制器。”
GLobal.asax.cs 代码
private static UnityContainer _container;
public static IUnityContainer Container
{
get { return _container; }
}
IUnityContainer IUnityContainerAccessor.Container
{
get { return Container; }
}
#endregion
protected void Application_Start()
{
if (_container == null)
{
_container = new UnityContainer();
ContainerConfig.RegisterTypes(_container);
}
WebApiConfig.Register(GlobalConfiguration.Configuration);
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AuthConfig.RegisterAuth();
}
ContainerConfig.cs
public static class ContainerConfig
{
public static void RegisterTypes(UnityContainer container)
{
container.RegisterInstance<IUnityContainer>(container);
container.RegisterType<Entities>(new HttpContextLifetimeManager<Entities>(), new InjectionConstructor());
container.RegisterType<IDatabaseContext, Entities>();
container.RegisterType<ICommonService, CommonService>();
container.RegisterType<ISearchService, SearchService>();
container.RegisterType<ILogger, Log4NetLogger>();
ControllerBuilder.Current.SetControllerFactory(typeof(UnityControllerFactory));
}
}
UnityControllerFactory.cs
public class UnityControllerFactory : DefaultControllerFactory
{
public override IController CreateController(RequestContext context, string controllerName)
{
try
{
var type = GetControllerType(context, controllerName);
if (type == null)
{
throw new InvalidOperationException(string.Format("Could not find a controller with the name {0}.", controllerName));
}
var container = GetContainer(context);
return (IController)container.Resolve(type);
}
catch
{
return null;
}
}
protected virtual IUnityContainer GetContainer(RequestContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
var unityContainerAccessor = context.HttpContext.ApplicationInstance as IUnityContainerAccessor;
if (unityContainerAccessor == null)
{
throw new InvalidOperationException("You must extend the HttpApplication in your web project and implement the IContainerAccessor to properly expose your container instance");
}
IUnityContainer container = unityContainerAccessor.Container;
if (container == null)
{
throw new InvalidOperationException("The container seems to be unavailable in your HttpApplication subclass");
}
return container;
}
}
请帮我解决这个问题。提前致谢。
【问题讨论】:
标签: asp.net-mvc-4 dependency-injection c#-5.0