在运行时使用Unity Property Injection注入IPrincipal

时间:2010-03-09 17:06:59

标签: asp.net-mvc dependency-injection unity-container

在ASP.Net MVC 2应用程序中使用Unity我对控制器的各种依赖关系正确实例化。但是,我想确保用户的当前IPrincipal将通过注入传递到较低级别的服务,存储库等。

因此,在较低级别的服务中,我有类似的东西:

[Dependency] IPrincipal CurrentUser {get; set;}

如果我使用Property Dependency Injection,我得不到我想要的东西,因为Controller在用户主体可用之前被实例化,并且在任何情况下Unity都不知道获取当前用户凭据。

所以我想要的是能够将当前用户的IPrincipal(或可能是RolePrincipal)注入到Controller的一个依赖项中。

我该怎么做?

3 个答案:

答案 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; }
    }
}