IControllerFactory' UnityControllerFactory'没有为名称'控制器'返回控制器

时间:2014-12-15 10:11:58

标签: asp.net-mvc-4 dependency-injection c#-5.0

我有一个MVC 5项目并使用Unity Framework进行依赖注入。一切都很好,但突然间我得到了错误

  

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

请帮我解决此问题。提前谢谢。

1 个答案:

答案 0 :(得分:0)

问题得到解决。我安装了re-sharper工具。在其中一个商务类中,我将其作为抽象。所以它抛出了错误。