Member 14615490 Ответов: 1

Ошибки при проверке дескриптора тип сервиса обслуживания: .....ihostedservice' не потребляют уровня сервиса


Привет
Я работаю на рабочем обслуживании asp.net ядро 3.0 .
Я получаю следующую ошибку:
Некоторые службы не могут быть сконструированы (ошибка при проверке дескриптора службы 'ServiceType: Microsoft.Расширения.Принимающий.IHostedService Lifetime: Singleton ImplementationType: WindowsService.Работник': нельзя использовать WindowsService уровня обслуживания.Модели.MotherLoadContext' от singleton 'Microsoft.Расширения.Принимающий.IHostedService'.)
Источник=Microsoft.Расширения.DependencyInjection

Внутреннее Исключение 1:
InvalidOperationException: ошибка при проверке дескриптора службы 'ServiceType: Microsoft.Расширения.Принимающий.IHostedService Lifetime: Singleton ImplementationType: WindowsService.Работник': нельзя использовать WindowsService уровня обслуживания.Модели.DBContext' от singleton 'Microsoft.Расширения.Принимающий.IHostedService'.

Внутреннее Исключение 2:
InvalidOperationException: не удается использовать службу WindowsService с областью действия.Модели.DBContext' от singleton 'Microsoft.Расширения.Принимающий.IHostedService'.


Как мне решить эту проблему

Ниже приведен мой код:

This my code snippet:

<pre>public static void Main(string[] args)
        {
            var serviceCollection = new ServiceCollection();
            CreateHostBuilder(args).Build().Run();
            
        }

     

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    

                    services.AddDbContext<MotherLoadContext>(options => options.UseSqlServer(ConfigurationManager.ConnectionStrings["MotherLoadConnStr"].ConnectionString));

                    IConfiguration configuration = hostContext.Configuration;
                    ShopifyConfigSettings configSettings = configuration.GetSection("ShopifyWebService").Get<ShopifyConfigSettings>();
        
                    });
                    services.AddSingleton(configSettings);
                    services.AddHostedService<Worker>();
                    services.AddLogging();
                   



                 

                });


Что я уже пробовал:

Это мой фрагмент кода:

public static void Main(string[] args)
        {
            var serviceCollection = new ServiceCollection();
            CreateHostBuilder(args).Build().Run();
            
        }

     

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    

                    services.AddDbContext<MotherLoadContext>(options => options.UseSqlServer(ConfigurationManager.ConnectionStrings["MotherLoadConnStr"].ConnectionString));

                    IConfiguration configuration = hostContext.Configuration;
                    ShopifyConfigSettings configSettings = configuration.GetSection("ShopifyWebService").Get<ShopifyConfigSettings>();
        
                    });
                    services.AddSingleton(configSettings);
                    services.AddHostedService<Worker>();
                    services.AddLogging();
                   
                });

1 Ответов

Рейтинг:
1

Richard Deeming

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

Зависимость В Неволе[^]
Об опасностях и подводных камней использования служб уровня в контейнер сервисы iconfigureoptions[^]

Ваш Worker класс (что вы еще не показали) принимает прямую зависимость от службы с ограниченной областью действия - предположительно от контекста Entity Framework.

В документации приведен пример обхода этого ограничения:
Фоновые задачи с размещенными службами в ASP.NET ядро | Microsoft Docs[^]

По сути, вы вводите IServiceScopeFactory в вашу одиночную службу. Когда вам нужна служба с областью действия, вы создаете область действия и разрешаете ее из нее:

public class MySingletonService
{
    private IServiceScopeFactory Services { get; }
    
    public MySingletonService(IServiceScopeFactory services)
    {
        Services = services;
    }
    
    public void DoSomethingWithScopedService()
    {
        using (var scope = Services.CreateScope())
        {
            var myScopedService = scope.GetRequiredService<IScopedService>();
            // ... Use the service here ...
        }
    }
}
(Пример Microsoft вводит IServiceProvider, но IServiceScopeFactory это более уместно, так как вам нужно только CreateScope метод.)

NB: Это не чистый "DI", потому что зависимости одноэлементной службы скрыты в реализации. Некоторые люди назовут это "анти-шаблоном локатора услуг". Но, насколько я могу судить, это ваш единственный вариант использования службы с ограниченной областью действия из синглтона.