Dependency injection в ASP.Net Core

98
20 февраля 2022, 02:10

Сейчас сделано так

    public class UserController : Controller
    {
        private readonly UserService service;
        private ApplicationContext _context;
        public UserController(ApplicationContext context)
        {
            _context = context;
            service = new UserService(context);
        }
   ...

Хотел бы что бы было вот так (DI)

    public class UserController : Controller
    {
        private readonly UserService service;
        private ApplicationContext _context;
        public UserController(ApplicationContext context, UserService service)
        {
            _context = context;
            this.service = service;
        }
   ...
        public void ConfigureServices(IServiceCollection services)
        {
            string connection = "Server=ms-sql-8.in-solve.ru;Database=1gb_city-move;user id=1gb_city-move;password=a4bea42fsg;";
            services.AddDbContext<ApplicationContext>(options => options.UseSqlServer(connection));
            // проинжектить userService примерно так
            services.AddSingleton<UserService, UserService>(); // как-то передать параметр - экземпляр ApplicationContext

Есть ли смысл так делать и правильно ли это? Если да, как мне получить доступ к экземпляру ApplicationContext? В IServiceCollection его не нахожу

Спасибо

UPD

Сейчас сделал так:

 public class UserController : Controller
    {
        private readonly UserService service;
        private ApplicationContext _context;
        public UserController(ApplicationContext context, UserService uSrv)
        {
            _context = context;
            service = uSrv;
        }
    ...

Но

public UserService(ApplicationContext context)
{
  • конструктор с параметром

в Startup я не инжектил. Сам контейнер проинжектил UserService контекстом?

Всё так?

Если да, то по аналогии я делаю:

   public class AccountController : Controller
    {
        private ApplicationContext _context;
        private readonly UserService userService;
        private readonly AuthService authService;
        public AccountController(ApplicationContext context, AuthService authService, UserService uSrv)
        {
            _context = context;
            userService = uSrv;
            this.authService = authService;
        }

и даже если я инжектю

services.AddSingleton<UserService, UserService>();

при запуске получаю ошибку

InvalidOperationException: Cannot consume scoped service 'WebApplication1.Models.ApplicationContext' from singleton 'WebApplication1.BLL.UserService'. Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.VisitScopeCache(ServiceCallSite scopedCallSite, CallSiteValidatorState state)

Answer 1

и даже если я инжектю

services.AddSingleton<UserService, UserService>();

при запуске получаю ошибку

Незнаю поможет ли но в єтом случае нужно делать так:

services.AddSingleton<UserService>();
Answer 2

Ошибка возникает из-за того, что вы пытаетесь создать singleton сервис,с зависимостью от scoped сервиса, то есть ApplicationContext создается на каждый запрос, а UserService только один раз, соответственно, вам просто нужно зарегистрировать UserService тоже как scoped сервис:

services.AddScoped<UserService>();

В остальном вы все делаете верно, все сервисы сами получат свои зависимости от контейнера.

READ ALSO
asp.net publish и регистр букв

asp.net publish и регистр букв

Пользуюсь VS 2019

182
Как корректно проверить точность до десятых или сотых?

Как корректно проверить точность до десятых или сотых?

Есть веб-форма, на которой 2 текст бокса, в эти текстбоксы заносятся значения, double, их я проверяю, чтобы они были с точностью до двух знаков...

100
URL encoding/decoding

URL encoding/decoding

Добрый день!

94
Как разным потокам передавать разные параметры?

Как разным потокам передавать разные параметры?

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

90