Autofac Получение текущей личности
У меня есть служба, и практически каждый метод требует выполнения текущего пользователя. Прежде чем я начал использовать autofac, я в основном создал публичное свойство, подобное этому:
private IOrderProvider _orderProvider;
public IOrderProvider OrderProvider => _orderProvider ?? (_orderProvider = new OrderProvider((ClaimsIdentity)User.Identity));
Поскольку это было общедоступное свойство на контроллере, он будет иметь доступ к пользователю. Теперь, используя autofac, я регистрирую свой Сервис в StartupConfig. Естественно, у меня нет доступа к Пользователю там.
Есть ли способ внедрить текущего пользователя в конструктор OrderProvider или другой способ добраться до него?
1 ответ
Пользовательский принцип может быть доступен через 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;
}