Разрешить ограниченную службу из одноэлементной службы

Возможно ли каким-то образом разрешить сервис с ограниченной областью действия в методе одноэлементной службы, вызываемом с помощью метода с ограниченной областью действия?

Например. У меня есть одноэлементная служба «GlobalService» и одна «UserService» с ограниченными возможностями.

Если UserService выполняет метод Job в GlobalService, возможно ли каким-то образом получить в этом методе службы с заданной областью действия с помощью Assembly.GetCallingAssembly ()? В противном случае мне нужно передать все необходимые параметры.

Спасибо ✌


person tris    schedule 22.04.2020    source источник


Ответы (1)


Синглтон будет иметь один единственный экземпляр, который может использоваться вашей службой с определенной областью действия. Ваш метод службы с заданной областью может использовать одноэлементный экземпляр службы.

Если вы вызываете метод одноэлементной службы, вы можете получить в нем объект службы с заданной областью действия. Вы можете использовать IHttpcontextAccessor для разрешения экземпляра службы с заданной областью внутри этого метода.

internal class Singleton
{
    private readonly IHttpContextAccessor httpContextAccessor;

    public Singleton(IHttpContextAccessor httpContextAccessor)
    {
        this.httpContextAccessor = httpContextAccessor;
    }
    public int Job()
    {
        return httpContextAccessor.HttpContext.RequestServices.GetRequiredService<Scoped>().MyProperty;
    }
}

Вам нужно будет зарегистрировать эту службу в методе Startup ConfigureServices:

services.AddHttpContextAccessor();
services.AddScoped<Scoped>();
services.AddSingleton<Singleton>();
person Deepak Mishra    schedule 22.04.2020
comment
Значит, мне нужен хотя бы IHttpContextAccessor в качестве параметра? Это мое текущее решение - я бы хотел его удалить. Не могли бы вы набрать мне какой-нибудь псевдокод? - person tris; 22.04.2020
comment
Вам понадобится IHttpContextAccessor для доступа к экземпляру службы с ограниченной областью внутри методов службы singleton, другого способа, о котором я знаю, нет. - person Deepak Mishra; 22.04.2020
comment
Спасибо. Итак, поскольку IHttpContextAccessor ограничен определением, мне нужно передать его в метод Job? Например. недействительное задание (контекст IHttpContextAccessor) {} - person tris; 22.04.2020
comment
Большое спасибо! :) - person tris; 22.04.2020
comment
@tris, я зарегистрировал классы напрямую, возможно, вы захотите зарегистрироваться с их интерфейсами. - person Deepak Mishra; 22.04.2020
comment
Большое спасибо! :) Я понимаю! Не знал, что IHttpContextAccessor доступен в синглтоне! Большое спасибо! Блестяще! :) - person tris; 22.04.2020