3

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

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

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);
4

1 回答 1

0

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

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

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

于 2013-05-29T06:33:10.840 回答