【问题标题】:AccountController in MVC 5 and Unity IoCMVC 5 和 Unity IoC 中的 AccountController
【发布时间】:2015-02-11 23:38:12
【问题描述】:

我创建了一个新的 ASP.NET MVC 5 项目,其中包含个人用户身份验证。然后我继续将 Unity IoC 安装为一个包,并通过在 UnityConfig.cs 中执行以下操作来配置它:

public static void RegisterTypes(IUnityContainer container)
{
    container.RegisterTypes(AllClasses.FromLoadedAssemblies(), WithMappings.FromMatchingInterface, WithName.Default);
    container.RegisterType<AccountController>(new InjectionConstructor());
}

从我通过 Google 阅读的资料来看,这应该考虑到 Unity 会选择具有大多数参数的构造函数这一事实。我的AccountController.cs 有以下两个构造函数。

private ApplicationSignInManager _signInManager;
private ApplicationUserManager _userManager;

public AccountController()
{
}

public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager )
{
    UserManager = userManager;
    SignInManager = signInManager;
}

但我仍然遇到问题。当我导航到 http://localhost:xxxx/account/login 时,我收到 404 错误

这是我的RouteConfig.cs

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
    name: "Artist",
    url: "{controller}/{urlfriendly}/{action}",
    defaults: new { controller = "Artist", action = "Index" }
);

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

【问题讨论】:

  • 您不需要(或者,您是否)设置DependencyResolver?例如DependencyResolver.SetResolver(new UnityDependencyResolver(container));
  • 这已经在UnityMvcActivator.cs这一行中完成了DependencyResolver.SetResolver(new UnityDependencyResolver(container));
  • 获得 404 听起来更像是路由问题,而不是 DI 问题。
  • 添加了路由代码,我也是这么想的,但是找不到路由有什么问题!

标签: c# dependency-injection asp.net-mvc-5 asp.net-mvc-routing unity-container


【解决方案1】:

我怀疑,问题出在你的路线上。

将路由想象成 c# 中的 switch case 语句。您遇到的问题是,每当第一条路线遇到 any 3 段路线时,它都会始终 匹配。因此,任何普通的/controller/action/id 都不会命中您的默认路由。

路径中需要有 1 个或多个约束和/或 1 个或多个显式段,以确保它在某个时间点匹配,或者您基本上使一个无法访问执行路径。

这是一个带有显式段的示例。

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
    name: "Artist",
    url: "Artist/{urlfriendly}/{action}",
    defaults: new { controller = "Artist", action = "Index" }
);

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

【讨论】:

  • 我本来是想写的,但由于复制/粘贴默认值而错过了它。谢谢夜猫子 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多