Ограничения маршрута не могут разрешить ограниченную службу от root провайдера - PullRequest
0 голосов
/ 14 июля 2020

Когда я пытаюсь создать для ограничения, я получаю сообщение об ошибке: «Не удается разрешить службу с заданной областью 'DbContextName' от root поставщика.

endpoints.MapControllerRoute(
                    name: "_redirect",
                    pattern: "{filter}",
error line>>        constraints: new { _filter = new MyFilter(app.ApplicationServices.GetRequiredService<DbContextName>()) },
                    defaults: new { controller = "Controller", action = "Action", }); 
        public class MyFilter: IRouteConstraint
        {
            private readonly DbContextName Context;
            public MyFilter(DbContextName _context)
            {
                Context = _context;
            }

            public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
            {
               some codes
            }
        }

В моем startup.cs есть службы dbcontext и когда я удаляю это ограничение, проект запускается правильно.

1 Ответ

0 голосов
/ 14 июля 2020

Это происходит потому, что AddDbContext добавляет зависимость DbContextName как Scoped. Если вы хотите разрешить зависимость с заданной областью действия, вы должны находиться в области действия. Поскольку вы находитесь не в веб-запросе, а в запуске приложения, вы не можете разрешить эту зависимость.

Вы можете разрешить это следующим образом:

endpoints.MapControllerRoute(
                    name: "_redirect",
                    pattern: "{filter}",
                    constraints: new { _filter = new MyFilter(app.ApplicationServices) },
                    defaults: new { controller = "Controller", action = "Action", }); 

        public class MyFilter: IRouteConstraint
        {
            private readonly DbContextName Context;
            public UserConstraint(IServiceProvider _serviceProvider)
            {
                ServiceProvider = _serviceProvider;
            }

            public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
            {
               DBContextName dbContext = ServiceProvider.GetRequiredService<DBContextName>()
               //rest of your code
            }
        }
...