Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在运行时使用Unity属性注入注入IPrincipal_Asp.net Mvc_Dependency Injection_Unity Container - Fatal编程技术网

Asp.net mvc 在运行时使用Unity属性注入注入IPrincipal

Asp.net mvc 在运行时使用Unity属性注入注入IPrincipal,asp.net-mvc,dependency-injection,unity-container,Asp.net Mvc,Dependency Injection,Unity Container,在ASP.NETMVC2应用程序中使用Unity,我对正确实例化的控制器有各种依赖关系。但是,我希望确保用户当前的IPrincipal将通过注入传递给较低级别的服务、存储库等 因此,在较低级别的服务中,我有如下内容: [Dependency] IPrincipal CurrentUser {get; set;} 如果我使用属性依赖项注入,我不会得到我想要的,因为控制器是在用户主体可用之前实例化的,并且在任何情况下Unity都不知道如何获得当前用户凭据 所以我想要的是能够将当前用户的IPrinc

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

因此,在较低级别的服务中,我有如下内容:

[Dependency] IPrincipal CurrentUser {get; set;}
如果我使用属性依赖项注入,我不会得到我想要的,因为控制器是在用户主体可用之前实例化的,并且在任何情况下Unity都不知道如何获得当前用户凭据

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


我怎样才能做到这一点呢?

为什么不走直达路线,然后分配它呢

Thread.CurrentPrincipal=用户


依赖注入很好,但不要让它妨碍最好的依赖注入者程序员。

为什么要注入它?当前主体已作为
用户
出现。这就是我们所使用的,到目前为止效果很好。用户不应该在单个请求中更改,是吗

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

虽然这条线索很古老,但乔恩·克鲁格似乎有一个直接回答了原始问题的答案:

谢谢乔尔特科拉先生和姆涅莫辛先生的回答。我同意关于依赖注入的评论。我现在的想法是让它自动出现在服务和存储库中,这样在开发人员每次更新数据库时控制器类中就不会有额外的代码。由于这与审计相关,我希望确保运行时用户始终可用,并且开发人员不必记住传递它。+1 Thread.CurrentPrincipal已经是处理当前用户的事实标准,很少有理由偏离这种公认的编码习惯用法。应用程序是多层的,极有可能部署到多层中,因此我有一个应用程序CustomPrincipal,可以通过它来避免对具有HttpContext依赖关系的中/后端层的任何污染。假设Web演示文稿(MVC控制器)与中端服务之间存在WCF通信,我是否可以确定Thread.CurrentPrincipal将返回WebForms authenticated IPrincipal?Context.User,如果网站调用技术无关的域模型,则该用户的工作不太好。如果域模型试图访问任何类型的HTTP上下文,那将是一个严重的错误。然而,我认为域模型无论如何都不应该与一些静态外部交互。其思想是将用户放入上下文中,以便控制器可以使用它。最终,应该是控制器调用域模型,对吗?也许您可以更进一步地说:域模型根本不应该有关于用户执行代码的概念。如果域模型与授权有关,那么它只需要包含该功能本身,因此我们必须基于当前用户设置域模型,我们也应该在controller中这样做?!问题是通过wcf在多层部署中一路传递凭据,并在自定义原则中带来一些其他属性(例如角色)。我没有使用wcf,因此我很难对此发表评论。也许你应该在原来的问题中这样说?对于一个“普通”的MVC应用程序,我的方法可以很好地工作,并且在定制的IPrincipal中也有角色等。尽管我必须承认,让用户进入
应用程序\u AuthenticateRequest()
并不是很聪明,因为通常不需要执行身份验证,例如图像。再说一次,使用CDN应该是没有问题的。。。