正确的依赖方式将经过身份验证的用户注入我的存储库类

时间:2013-05-24 19:51:35

标签: asp.net-mvc-3 unity-container repository-pattern service-layer

我正在使用具有存储库模式的服务层。控制器依赖于服务层,服务层依赖于存储库。

我必须将登录的用户信息传递到存储库层以进行授权,并且我正在尝试确定将用户信息注入存储库的最佳方法,因为我似乎有一个广泛的注入链:

controller -> service(s) -> repositories -> logged in user info.  

我想简单的方法是将用户信息传递给被调用的服务方法(即FindById(int primaryKey, User currentUser)等)

但是,与注入用户信息相比,这似乎非常有限并且存在问题。

这个问题的推荐方法是什么?


我对文章中的人如何实现ICurrentUserFetcher感到有些困惑。我认为这将提供IIdentity无法提供的额外属性,但文章并没有明确说明这一点。

class GenericRepository<T>: IRepository<T> {
    private readonly ICurrentUserFetcher currentUserFetcher;
    public GenericRepository<T>(Func<IIdentity> currentUserFetcher) {
        this.currentUserFetcher = currentUserFetcher;
    }
    public void Update(T entity) {
        var currentUser = currentUserFetcher();
        ...
    }
}   
var repo = new GenericRepository<Person>(() => HttpContext.Current.User.Identity);

1 个答案:

答案 0 :(得分:0)

登录后将用户信息分配给当前主体。 Google关于IPrincipalIIdentity。这两个类是.NET中内置的方式来处理当前登录的用户。

要访问用户,只需使用Thread.CurrentPrincipal.Identity即可。但是,我不会在存储库中使用该属性,而只在服务类中使用该属性。这样做的原因是存储库不应该负责告诉哪个用户获取信息。

要为每个请求分配用户,您必须在global.asax中使用PostAuthenticate事件。