ASP.NET Core Singleton Service создан несколько раз - PullRequest
1 голос
/ 27 июня 2019

Я работаю над проектом ASP.NET Core 2.1, в котором мне нужно зарегистрироваться, а затем использовать одноэтапную службу внутри Startup.ConfigureServices.

У меня есть следующий код:

public void ConfigureServices(IServiceCollection services)
{
    //....
    //....

    services.AddSingleton<IMyService,MyService>();

    var serviceProvider = services.BuildServiceProvider();

    var myService = serviceProvider.GetService<IMyService>();

    services.AddDbContext<MyDbContext>(options => options.UseMySql(myService.DBConnectionString));
}

Приведенный выше код отлично работает, чтобы я мог использовать «MyService» внутри ConfigureServices. Однако позже в моем приложении, когда я пытаюсь использовать MyService, конструктор MyService вызывается снова. Почему он не использует экземпляр, который уже был создан, так как я зарегистрировал класс, используя AddSingleton?

РЕДАКТИРОВАТЬ: Я решил отредактировать, чтобы добавить свою конечную цель, чтобы увидеть, если, возможно, есть другой способ сделать это. Мой синглтон сервис предоставляет доступ к нескольким настройкам, которые могут прийти из 2 разных мест. Одним из таких параметров является строка подключения к БД. Мне нужна эта строка подключения в ConfigureServices, чтобы она была у меня при вызове services.AddDbContext. Я также хочу выполнить вход в службу, которая получает параметры конфигурации, а это значит, что мне также нужно получить ILoggerFactory.

Ответы [ 2 ]

1 голос
/ 27 июня 2019

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

//...

services.AddSingleton<IMyService,MyService>();

services.AddDbContext<MyDbContext>((serviceProvider, options) =>
    options.UseMySql(serviceProvider.GetService<IMyService>().DBConnectionString)
);

//....

Ссылка AddDbContext<TContext>(IServiceCollection, Action<IServiceProvider,DbContextOptionsBuilder>, ServiceLifetime, ServiceLifetime)

0 голосов
/ 27 июня 2019

AddSingleton говорит Unity построить его один раз.Это «один раз» является дополнением к любым конструкторам, которые вы вызываете непосредственно в своем коде.

Если вы хотите повторно использовать созданный вами экземпляр, используйте вместо него AddInstance.

var serviceProvider = services.BuildServiceProvider();

var myService = serviceProvider.GetService<IMyService>();

services.AddInstance<IMyService>(myService);

services.AddDbContext<MyDbContext>(options => options.UseMySql(myService.DBConnectionString));
...