我对如何实现asp .net身份模板的代码感到困惑。
private ApplicationSignInManager _signInManager;
private ApplicationUserManager _userManager;
private ApplicationRoleManager _roleManager;
public AuthController() { }
public AuthController(ApplicationUserManager userManager, ApplicationSignInManager signInManager, ApplicationRoleManager roleManager)
{
UserManager = userManager;
SignInManager = signInManager;
RoleManager = roleManager;
}
public ApplicationRoleManager RoleManager
{
get { return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>(); }
private set { _roleManager = value; }
}
public ApplicationSignInManager SignInManager
{
get { return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>(); }
private set { _signInManager = value; }
}
public ApplicationUserManager UserManager
{
get { return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); }
private set { _userManager = value; }
}
为什么我们有带参数的AuthController?依赖注入的目的?如果没有注入,那么调用在 Startup.cs 上指定的owincontext?这是否意味着我们可以忽略owincontext并仅使用注入?
当我试图调试它的运行方式时,它只能通过无参数构造函数来破坏我的代码。是否未使用此参数化构造函数?
有什么想法吗?感谢。
答案 0 :(得分:1)
实际上,这个模板用于处理DI容器而没有一个 - 用于覆盖所有情况。如上所述 - 如果使用DI,则使用带参数的构造函数。
如果构造函数中没有提供任何内容,则进入OWIN并获取所需对象的实例。
是的,如果您正在使用DI,则可以使用HttpContext.GetOwinContext()
删除属性,并将构造函数保留为参数。
如果您正在使用DI,但是控制器是通过无参数构造函数创建的,那么您没有为Asp.Net配置DependencyResolver
。在Global.asax.cs中(或者在你进行DI配置的任何地方),你需要调用DependencyResolver.SetResolver(myContainerWrapper);
,其中myContainerWrapper
是IDependencyResolver
,你需要查看你的DI容器如何与Asp.Net集成