【问题标题】:Proper way to dependency inject authenticated user to my repository class将经过身份验证的用户依赖注入到我的存储库类的正确方法
【发布时间】:2013-05-20 12:10:36
【问题描述】:

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

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

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

【问题讨论】:

  • 我想我找到了一篇似乎可以解决这个问题的文章。问题是我试图将 http 上下文与存储库分离,这似乎做得很好。这是文章:stackoverflow.com/questions/2946042/…。从脱钩的角度来看,这种方法是否存在任何负面问题?

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2016-01-17
    • 2020-11-15
    • 2018-01-07
    • 1970-01-01
    相关资源
    最近更新 更多