Tôi đã sử dụng IoC để trừu tượng này đi với một số thành công. Lần đầu tiên tôi xác định một lớp đại diện cho người dùng hiện đã đăng nhập:
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; }
}
Phải mất IIdentity
trong hàm tạo để đặt giá trị của nó. Đối với các bài kiểm tra đơn vị, bạn có thể thêm một hàm tạo khác để cho phép bạn bỏ qua phụ thuộc IIdentity
.
Và sau đó tôi sử dụng Ninject (chọn container IoC yêu thích của bạn, không quan trọng), và tạo ra một ràng buộc cho IIdentity
như vậy:
Bind<IIdentity>().ToMethod(c => HttpContext.Current.User.Identity);
Sau đó, bên trong bộ điều khiển của tôi Tôi tuyên bố phụ thuộc vào constructor:
CurrentUser _currentUser;
public HomeController(CurrentUser currentUser)
{
_currentUser = currentUser;
}
các container IoC thấy rằng HomeController
mất một đối tượng CurrentUser
, và các nhà xây dựng CurrentUser
mất một IIdentity
. Nó sẽ tự động giải quyết các phụ thuộc, và thì đấy! Bộ điều khiển của bạn có thể biết ai là người dùng hiện đang đăng nhập. Dường như nó hoạt động khá tốt với tôi với FormsAuthentication. Bạn có thể thích ứng với ví dụ này để xác thực Windows.
Nguồn
2010-06-12 02:54:23
Đối với tôi, phương pháp này là thích hợp hơn để chế giễu bộ điều khiển và nguyên tắc và ngữ cảnh http, v.v., mỗi khi tôi quên chính xác phần nào tôi cần giả lập và phải truy tìm các thử nghiệm khác để tìm mã phù hợp để sao chép và dán. Trong trường hợp của tôi, các bộ điều khiển có giao diện ICurrentUserResolver, có một phương thức ResolveCurrentUser(), và bộ điều khiển không bao giờ phải lo lắng về cách người dùng hiện tại được xác định. –
Cảm ơn bạn @ JohnNelson, bạn đã cứu mạng tôi –