我正在使用具有存储库模式的服务层。控制器依赖于服务层,服务层依赖于存储库。
我必须将登录的用户信息传递到存储库层以进行授权,并且我正在尝试确定将用户信息注入存储库的最佳方法,因为我似乎有一个广泛的注入链:
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);
答案 0 :(得分:0)
登录后将用户信息分配给当前主体。 Google关于IPrincipal
和IIdentity
。这两个类是.NET中内置的方式来处理当前登录的用户。
要访问用户,只需使用Thread.CurrentPrincipal.Identity
即可。但是,我不会在存储库中使用该属性,而只在服务类中使用该属性。这样做的原因是存储库不应该负责告诉哪个用户获取信息。
要为每个请求分配用户,您必须在global.asax中使用PostAuthenticate事件。