2016-08-02 66 views
0

我对如何从asp.net标识模板执行代码感到困惑。Asp.Net身份的Owin上下文

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并仅使用注入?

而当我试图调试这是如何运行,它只是通过无参数的构造函数,它打破了我的代码。这个参数化构造函数没有被使用吗?

有什么想法?谢谢。

回答

1

事实上,这个模板是用于使用DI容器,没有一个 - 以涵盖所有情况。正如你所说 - 如果使用DI,则使用带参数的构造函数。

如果在构造函数中没有提供任何内容,则进入OWIN并获取所需对象的实例。

是的,如果您是使用DI,您可以使用HttpContext.GetOwinContext()删除属性,只需将参数留给构造函数即可。

如果您使用DI,但通过无参数构造函数创建控制器,那么您没有为Asp.Net配置DependencyResolver。在Global.asax.cs中(或任何您进行DI配置的地方),您需要拨打DependencyResolver.SetResolver(myContainerWrapper);,其中myContainerWrapperIDependencyResolver,您需要查看DI容器如何与Asp.Net集成。