我有一个服务电话DataManager
需要对当前IPrincipal
用户的引用。但是,我不想使用像System.Threading.Thread.CurrentPrincipal
或HttpContext.Current.User
这样的全局引用,因为我希望能够对其进行单元测试并为任何给定的测试指定任何用户。但我也不想为多线程环境(如WebApi或Web Services)中的每个线程构造一个新的DataManager
。
如果我注入(通过构造函数)内部使用IPrincipal
或HttpContext.Current.User
的{{1}}实现,这是不好的做法还是会破坏任何内容?否则我该如何处理?
我想到的解决方案看起来像这样:
HttpContext.Current.User
然后,在ASP.NET中使用它时,传入一个引用HTTP上下文当前用户的IPrincipal实现:
public class DataManager {
public DataManager(IPrincipal currentUser){
this.currentUser = currentUser;
}
private IPrincipal currentUser;
...
public void DoWork(){
var currentUserName = currentUser.Identity.Name;
// Do work here
}
}