使用MVC+Autofac,所有Service都是通过构造函数注入Controller。
现在想把当前用户的信息(用户,角色,菜单,访问IP等)封装在一个CurrentUser类里:
当哪个Controller需要时就直接new CurrentUser()
现在的问题是:去DB取用户信息时需要调用AuthorityService类,这个要如何使用Autofac注入到CurrentUser里
————————————————————————————————————————
public class CurrentUser
{
public CurrentUser()
{
if (!HttpContext.Current.User.Identity.IsAuthenticated)
{
throw new Exception("用户未登陆!");
}
//先去缓存查找
//缓存找不到时
//去DB取并存入缓存 AuthorityService.GetUser(HttpContext.Current.User.Identity.Name)
}
public IAuthorityService AuthorityService { get; set; }
/// <summary>
/// UserInformation
/// </summary>
public UserAccount UserInfo { get; set; }
/// <summary>
/// Menu List
/// </summary>
public IList<Menu> Menus { get; set; }
/// <summary>
/// Role
/// </summary>
public Role Role { get; set; }
}
怎么不用实体数据库
1 你可以试试在CurrentUser 中注入AuthorityService
public class CurrentUser :ICurrentUser { private _authorityService; public CurrentUser(AuthorityService auth) { _authorityService = auth;
.... } }
Autofac没有属性注入吗?
全部是构造函数注入。这样在每个需要CurrentUser的构造函数里也也加个ICurrentUser的参数了。
使用了如下方法来实现
需要使用User信息的Controller都在构造函数注入这个ICurrentUserFactory工厂。
需要具体信息时直接用工厂的GetCurrentUser()去获取。缓存等在工厂的GetCurrentUser()中实现。
也可以解决登陆前后获取用户信息的问题。
public interface ICurrentUserFactory { CurrentUser GetCurrentUser(); } public class CurrentUserFactory : ICurrentUserFactory { private readonly IAuthorityService _authorityService; public CurrentUserFactory(IAuthorityService authorityService) { this._authorityService = authorityService; } public CurrentUser GetCurrentUser() { if (!HttpContext.Current.User.Identity.IsAuthenticated) { throw new Exception("用户未登陆!"); } var request = HttpContext.Current.Request; var username = HttpContext.Current.User.Identity.Name; var currentUser = new CurrentUser(); currentUser.UserAccount = _authorityService.GetUser(username); return currentUser; } }
有没有人有更好的方法?
builder.RegisterType<CurrentUser>();
public CurrentUser(AuthorityService auth) { _authorityService = auth;
.... }