我有服务,几乎每种方法都需要当前用户执行。在我开始使用autofac之前,我基本上创建了一个这样的公共属性:
private IOrderProvider _orderProvider;
public IOrderProvider OrderProvider => _orderProvider ?? (_orderProvider = new OrderProvider((ClaimsIdentity)User.Identity));
因为这是控制器上的公共财产,所以它可以访问用户。现在使用autofac我在 StartupConfig 中注册服务。当然,我无法访问那里的用户。
有没有办法将当前用户注入 OrderProvider 构造函数,或其他方式来获取它?
答案 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;
}