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;
}
Другие вопросы по тегам