首页 新闻 会员 周边

MVC结合Autofac时CurrentUser的问题

0
悬赏园豆:10 [待解决问题]

使用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; }
}

lightnear的主页 lightnear | 初学一级 | 园豆:198
提问于:2013-10-21 12:10
< >
分享
所有回答(4)
0

怎么不用实体数据库

大芝麻 | 园豆:4 (初学一级) | 2013-10-21 12:32
1

1 你可以试试在CurrentUser 中注入AuthorityService

public class CurrentUser :ICurrentUser
{
    private _authorityService;
    public CurrentUser(AuthorityService auth)
    {
       _authorityService = auth;  
    .... } }
Tinki | 园豆:340 (菜鸟二级) | 2013-10-21 13:04

Autofac没有属性注入吗?

全部是构造函数注入。这样在每个需要CurrentUser的构造函数里也也加个ICurrentUser的参数了。

支持(0) 反对(0) lightnear | 园豆:198 (初学一级) | 2013-10-21 13:22
0

使用了如下方法来实现

需要使用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;
        }
    }
lightnear | 园豆:198 (初学一级) | 2013-10-21 13:52

有没有人有更好的方法?

支持(0) 反对(0) lightnear | 园豆:198 (初学一级) | 2013-10-21 13:53
1

builder.RegisterType<CurrentUser>();

public CurrentUser(AuthorityService auth) { _authorityService = auth;
    .... }

向晚 | 园豆:79 (初学一级) | 2014-01-18 23:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册