我使用的IoC抽象送人了一些成功。我首先定義一個類來表示當前登錄的用戶:
public class CurrentUser
{
public CurrentUser(IIdentity identity)
{
IsAuthenticated = identity.IsAuthenticated;
DisplayName = identity.Name;
var formsIdentity = identity as FormsIdentity;
if (formsIdentity != null)
{
UserID = int.Parse(formsIdentity.Ticket.UserData);
}
}
public string DisplayName { get; private set; }
public bool IsAuthenticated { get; private set; }
public int UserID { get; private set; }
}
它需要一個IIdentity
在構造以設置其值。對於單元測試,您可以添加另一個構造函數以允許您繞過IIdentity
依賴項。
然後我用Ninject(挑自己喜歡的IoC容器,無所謂),並創建了一個約束力的IIdentity
這樣:
Bind<IIdentity>().ToMethod(c => HttpContext.Current.User.Identity);
然後,我的控制器裏面,我宣佈在依賴構造:
CurrentUser _currentUser;
public HomeController(CurrentUser currentUser)
{
_currentUser = currentUser;
}
控制反轉容器看到該HomeController
需要CurrentUser
對象,並且CurrentUser
構造函數採用IIdentity
。它會自動解決依賴關係,瞧!您的控制器可以知道當前登錄的用戶是誰。 FormsAuthentication對我來說似乎很好。您可能可以將此示例適用於Windows身份驗證。
對我來說,這個方法是最好嘲諷控制器和原理以及http上下文等等,每次我都忘記了我需要嘲笑哪些部分,並且必須通過其他測試來尋找合適的代碼來複制和粘貼。在我的情況下,控制器採用ICurrentUserResolver接口,該接口具有ResolveCurrentUser()方法,並且控制器從不需要擔心當前用戶是如何確定的。 – 2014-02-19 06:25:32
謝謝@JohnNelson,你救了我的命 – 2017-08-10 04:32:50