2016-08-02 61 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集成。