Autofac获取当前身份

时间:2016-11-25 15:11:59

标签: c# asp.net-web-api autofac

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

private IOrderProvider _orderProvider;

public IOrderProvider OrderProvider => _orderProvider ?? (_orderProvider = new OrderProvider((ClaimsIdentity)User.Identity));

因为这是控制器上的公共财产,所以它可以访问用户。现在使用autofac我在 StartupConfig 中注册服务。当然,我无法访问那里的用户

有没有办法将当前用户注入 OrderProvider 构造函数,或其他方式来获取它?

1 个答案:

答案 0 :(得分:3)

可以通过HttpContext.Current.User访问用户原则。如何将代码紧密耦合到HttpContext是不受欢迎的,因为它不是非常单元测试。所以创建一个暴露你想要的服务。

public interface IPrincipleProvider {
    IPrincple User { get; }
}

生产中的实现可能如下所示。

public class DefaultPrincipleProvider : IPrincipleProvider {
    public IPrincple User { get { return HttpContext.Current.User; } }
} 

完成更新后,依赖类使用抽象

public class OrderProvider : IOrderProvider {
    private readonly ClaimsIdentity identity;
    public OrderProvider(IPrincipleProvider provider) {
        identity = (ClaimsIdentity)provider.User.Identity;
    }
    //...other code
}

然后像往常一样在启动时注册提供程序

//...other code removed for brevity

builder.RegisterType<DefaultPrincipleProvider>().As<IPrincipleProvider>();
builder.RegisterType<OrderProvider>().As<IOrderProvider>();

//...other code removed for brevity

服务应该注入所有内容

public class Service {
    private readonly IOrderProvider _orderProvider;

    public Service(IOrderProvider orderProvider) {
        _orderProvider = orderProvider;
    }

    public IOrderProvider OrderProvider => _orderProvider;
}