C# Autofac正在获取当前标识

C# Autofac正在获取当前标识,c#,asp.net-web-api,autofac,C#,Asp.net Web Api,Autofac,我有一个服务,几乎每个方法都需要当前用户执行。在开始使用autofac之前,我基本上创建了一个公共属性,如下所示: private IOrderProvider _orderProvider; public IOrderProvider OrderProvider => _orderProvider ?? (_orderProvider = new OrderProvider((ClaimsIdentity)User.Identity)); 因为这是控制器上的公共属性,所以它可以访问用

我有一个服务,几乎每个方法都需要当前用户执行。在开始使用autofac之前,我基本上创建了一个公共属性,如下所示:

private IOrderProvider _orderProvider;

public IOrderProvider OrderProvider => _orderProvider ?? (_orderProvider = new OrderProvider((ClaimsIdentity)User.Identity));
因为这是控制器上的公共属性,所以它可以访问用户。现在,我使用autofac在StartupConfig中注册我的服务。当然,我无法访问那里的用户


有没有一种方法可以将当前用户注入到OrderProvider构造函数中,或者用另一种方法获取它?

用户主体可以通过
HttpContext.current.user
访问。不赞成代码与HttpContext紧密耦合,因为它对单元测试不太友好。因此,创建一个公开您想要的内容的服务

using System.Security.Principal;
public interface IPrincipalProvider
{
    IPrincipal User { get; }
}
生产中的实现可以是这样的

using System.Security.Principal;    
public class DefaultPrincipalProvider : IPrincipalProvider
{
    public IPrincipal User
    {
        get
        {
            return HttpContext.Current.User;
        }
    }
} 
完成后,更新依赖类以使用抽象

public class OrderProvider : IOrderProvider
{
    private readonly ClaimsIdentity identity;
    public OrderProvider(IPrincipalProvider provider) {
        identity = (ClaimsIdentity)provider.User.Identity;
    }
}
然后像往常一样在启动时注册提供程序

//...other code removed for brevity

builder.RegisterType<DefaultPrincipalProvider>().As<IPrincipalProvider>();
builder.RegisterType<OrderProvider>().As<IOrderProvider>();

//...other code removed for brevity

用户主体可以通过
HttpContext.Current.user
访问。不赞成代码与HttpContext紧密耦合,因为它对单元测试不太友好。因此,创建一个公开您想要的内容的服务

using System.Security.Principal;
public interface IPrincipalProvider
{
    IPrincipal User { get; }
}
生产中的实现可以是这样的

using System.Security.Principal;    
public class DefaultPrincipalProvider : IPrincipalProvider
{
    public IPrincipal User
    {
        get
        {
            return HttpContext.Current.User;
        }
    }
} 
完成后,更新依赖类以使用抽象

public class OrderProvider : IOrderProvider
{
    private readonly ClaimsIdentity identity;
    public OrderProvider(IPrincipalProvider provider) {
        identity = (ClaimsIdentity)provider.User.Identity;
    }
}
然后像往常一样在启动时注册提供程序

//...other code removed for brevity

builder.RegisterType<DefaultPrincipalProvider>().As<IPrincipalProvider>();
builder.RegisterType<OrderProvider>().As<IOrderProvider>();

//...other code removed for brevity

创建一个包装HttpContext并公开用户原则或身份的服务。你想要哪一个?你能给我举个例子吗?创建一个包装HttpContext并公开用户原则或身份的服务。你想要哪一个?你能给我举个例子吗?有了这个“服务”,不也需要注册吗?然后注入控制器?我假设我必须做一些类似的事情:
private readonly Service\u Service
,然后当我需要订单提供商时,我需要做
\u Service.OrderProvider
?是的。我只演示了与访问IPrinciple相关的部分。我对你的架构不太了解。这只是一个简单的例子。我以为你已经注册了你的服务。我说的是你为orderProvider提供的包装服务?除非你把它看作控制器?好吧,现在我不明白你在说什么。请澄清。我的示例中的
服务
完全基于您提到的
我有一个服务,实际上每个方法都需要当前用户执行
我只添加了用户抽象。其他所有内容都来自您最初的示例。我把它们包括在答案中只是为了说明它们是如何结合在一起的。有了这个“服务”,不也需要注册吗?然后注入控制器?我假设我必须做一些类似的事情:
private readonly Service\u Service
,然后当我需要订单提供商时,我需要做
\u Service.OrderProvider
?是的。我只演示了与访问IPrinciple相关的部分。我对你的架构不太了解。这只是一个简单的例子。我以为你已经注册了你的服务。我说的是你为orderProvider提供的包装服务?除非你把它看作控制器?好吧,现在我不明白你在说什么。请澄清。我的示例中的
服务
完全基于您提到的
我有一个服务,实际上每个方法都需要当前用户执行
我只添加了用户抽象。其他所有内容都来自您最初的示例。我把它们包括在答案中只是为了说明它们是如何结合在一起的。