1

第一次使用 Unity,

我已经建立了一个这样的类并在 global.asax 中注册:

public class UnityControllerFactory : DefaultControllerFactory
{
    private IUnityContainer container;

    public UnityControllerFactory()
    {
        container = new UnityContainer();
        RegisterTypes();
    }

    protected override IController GetControllerInstance(
      System.Web.Routing.RequestContext requestContext, 
      Type controllerType)
    {
        return controllerType == null ?
            null :
            (IController)container.Resolve(controllerType);
    }

    private void RegisterTypes()
    {
        container.RegisterType<IUserRepository, EFUserRepository>();
    }
}

问题是,当调用 AccountController(默认 MVC 项目自带)时,会抛出错误:

Microsoft.Practices.Unity.dll 中出现“Microsoft.Practices.Unity.ResolutionFailedException”类型的异常,但未在用户代码中处理

我可以看到有一种方法可以检查类型是否已注册,但是当我进行检查时,如何强制框架使用默认控制器?

if (container.IsRegistered(controllerType))

这是我的路由,如您所见......我希望登录页面成为人们看到的第一页......

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/",
            defaults: new {
                 controller = "Account",
                 action = "Login",
                 returnUrl = UrlParameter.Optional }
        );
    }
}
4

1 回答 1

1

在工厂实施了一个稍微不同的尝试:

public class UnityControllerFactory : DefaultControllerFactory
{
    private IUnityContainer container;
    private IControllerFactory defaultControllerFactory;

    public UnityControllerFactory()
    {
        container = new UnityContainer();
        defaultControllerFactory = new DefaultControllerFactory();
        RegisterTypes();
    }

    public override IController CreateController(RequestContext ctx, string controllerName)
    {
        try
        {
            return container.Resolve<IController>(controllerName);
        }
        catch 
        {
            return defaultControllerFactory.CreateController(ctx, controllerName);
        }
    }

    private void RegisterTypes()
    {
        container.RegisterType<IUserRepository, EFUserRepository>();
    }
}

不过仍然会引发错误……嗯。

于 2013-11-11T02:23:28.673 回答