在ASP.Net MVC 2应用程序中使用Unity我对控制器的各种依赖关系正确实例化。但是,我想确保用户的当前IPrincipal将通过注入传递到较低级别的服务,存储库等。
因此,在较低级别的服务中,我有类似的东西:
[Dependency] IPrincipal CurrentUser {get; set;}
如果我使用Property Dependency Injection,我得不到我想要的东西,因为Controller在用户主体可用之前被实例化,并且在任何情况下Unity都不知道获取当前用户凭据。
所以我想要的是能够将当前用户的IPrincipal(或可能是RolePrincipal)注入到Controller的一个依赖项中。
我该怎么做?
答案 0 :(得分:7)
为什么不采取直接路线,只需分配它。
Thread.CurrentPrincipal = user;
依赖注入是好的,但不要让它妨碍最好的依赖注入器,程序员。
答案 1 :(得分:2)
虽然这个帖子已经陈旧,但看起来Jon Kruger的答案似乎直接回答了原来的问题:http://jonkruger.com/blog/2009/04/13/hiding-threadcurrentprincipal-from-your-code/
答案 2 :(得分:0)
为什么注射它?当前主体已经显示为User
。这就是我们使用的,到目前为止工作正常。用户不应该在单个请求中进行更改,是吗?
protected void Application_AuthenticateRequest()
{
var ticket = GetAuthenticationTicket();
// Perform actual authentication, etc.
MyUser user = BigAuthStuff();
Context.User = user;
Thread.CurrentPrincipal = user;
}
public class MyBaseController : Controller
{
protected MyUser AuthenticatedUser
{
get { return User as MyUser; }
}
}