private readonly UserService userService;
public AccountController(UserService userService)
{
this.userService = userService;
}
[HttpPost]
public ActionResult Login(string username, string password)
{
bool validUser = this.userService.ValidateUser(username, password);
// bool validUser = UserService.ValidateUser(username, password);
if (validUser)
{
FormsAuthentication.SetAuthCookie(username, true);
return Json(new
{
valid = true,
action = "Views/Home/Index"
});
}
else
{
return Json(new
{
valid = false,
action = "Views/Account/_LoginPartial"
});
}
}
我的 ajax 帖子无法访问该方法Login
,因为:
private readonly UserService userService;
public AccountController(UserService userService)
{
this.userService = userService;
}
如果我删除此代码,它可以工作。但是为什么?如何在我的登录方法中使用userService
而不像那样实例化它?
此控制器看起来像是打算与依赖注入工具一起使用。
如果有一个,则依赖项解析程序可能未正确配置。 如果您没有一个,那么可以使用nuget安装各种方法,例如ninject,unity,Simple injector等。
我的 ajax 帖子无法访问登录方法,因为:
private readonly UserService userService;
public AccountController(UserService userService)
{
this.userService = userService;
}
答案是肯定的!您可能错过并需要一个工厂来使用所需的UserService
为您创建此Controller
(我想知道为什么不使用interface
),否则,此Controller
不会被实例化,因此不会调用Login
操作。
这是一个 DI 构造注入,如果您的应用程序中有一个配置良好的控制器工厂,则应自动进行。
下面是您可以使用的简单自定义控制器工厂:
public class CustomControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
UserService userService = new UserService();
IController controller = Activator.CreateInstance(controllerType, new[] { userService }) as Controller;
return controller;
}
}
并且不要忘记注册它:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
RegisterCustomControllerFactory ();
}
private void RegisterCustomControllerFactory ()
{
IControllerFactory factory = new CustomControllerFactory();
ControllerBuilder.Current.SetControllerFactory(factory);
}
}
阅读本文: 面向初学者 ASP.NET MVC 控制器依赖项注入