Как использовать синглтон в asp.net core 2.1 с параметром (интерфейсом) - PullRequest
0 голосов
/ 30 июня 2019

В файле запуска

services.AddScoped<IUserResponsitory , UserResponsitory>();
services.AddSingleton<IAuthService>(service=>new AuthServiceImpl(
            service.GetService<IUserResponsitory>(),service.GetService<IConfiguration>()));

В файле AuthServiceImpl:

    private IUserResponsitory m_userResponsitory;
    private IConfiguration m_config;
    public  AuthServiceImpl(IUserResponsitory userResponsitory, IConfiguration config) 
    {
        m_config = config;
        m_userResponsitory = userResponsitory;
    }

В файле UserResponsitory.

public class UserResponsitory : Responsitory<Users>,IUserResponsitory
    {
        private DbSet<Users> userEntity;

        public UserResponsitory(MyDBContext context) : base(context)
        {
            userEntity = context.Set<Users>();
        }
    }

Ошибка ниже enter image description here

Некоторые из справки: help1

help2

Можете ли вы помочь мне. Пожалуйста!

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Как показывает ошибка, вы не можете разрешить службу с областью действия root provider.

Если вы предпочитаете использовать IAuthService в качестве Singleton, вы можете восстановить службу с IServiceProvider, как

  1. Startup.cs

    services.AddScoped<IUserResponsitory , UserResponsitory>();
    services.AddSingleton<IAuthService, AuthServiceImpl>();
    
  2. AuthServiceImpl

    public class AuthService : IAuthService
    {
        private readonly IServiceProvider _serviceProvider;
        private readonly IConfiguration m_config;
        public AuthService(IServiceProvider serviceProvider
            , IConfiguration configuration)
        {
            _serviceProvider = serviceProvider;
            m_config = configuration;
        }
    
        public void Auth()
        {
            using (var scope = _serviceProvider.CreateScope())
            {
                var db = scope.ServiceProvider.GetRequiredService<IUserResponsitory>();
                var result = db.Users.ToList();
            }
        }
    }
    
0 голосов
/ 30 июня 2019

Поскольку проверка области применения применяется .NET Core, вы не можете разрешить службы с ограниченным временем жизни (в вашем случае IUserResponsitory) в конструкторе службы, зарегистрированной с единичным временем жизни (IAuthService).

Таким образом, вам нужно изменить время жизни IAuthService на область действия.

services.AddScoped<IAuthService, AuthService>();

Полезные ресурсы:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2#scope-validation

https://bartwullems.blogspot.com/2019/02/aspnet-core-scope-validation.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...