Внедрение зависимостей ASP.NET Core Singleton - PullRequest
0 голосов
/ 26 декабря 2018

Могу ли я узнать, что не так со следующей строкой кода: -

Почему я не могу использовать синглтон на нем?

services.AddSingleton<IProductRepository, ProductRepository>();

Я получил 500 внутренних ошибок сервера наприведенный выше код, однако он отлично работает с Transient и Scoped.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Согласно Документация Microsoft :

Разрешить выделенную службу из одного экземпляра опасно.Это может привести к неправильному состоянию службы при обработке последующих запросов.

Теперь рассмотрим следующий код вашего ConfigureServices метода в Startup классе:

services.AddDbContext<ApplicationDbContext>(options =>
                       options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

В методе UseSqlServer есть второй параметр для Срок службы , значение по умолчанию которого равно ServiceLifetime.Scoped.Возможно, вы не указали второй параметр, поэтому он принимает значение по умолчанию ServiceLifetime.Scoped.Это означает, что ваш DbContext был зарегистрирован как Scoped service.Теперь, если вы используете DbContext в ProductRepository, тогда вашему ProductRepository нужно будет также противопоставить значение Scoped Service, иначе провайдер ASP.NET Core DI не сможет его разрешить.

Сейчас Если вы действительно хотите зарегистрироватьсяВаш ProductRepository как Singleton Служба затем сделать DbContext также Singleton следующим образом:

services.AddDbContext<ApplicationDbContext>(options =>
                    options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")),ServiceLifetime.Singleton);

Теперь это должно работать!

Примечание: я предположил, что ваш ProductRepository зависит от DbContext.Если нет, то ваш ProductRepository репозиторий должен зависеть от сервиса, который зарегистрирован как сервис Scoped, и поэтому в настоящее время вы не можете использовать ProductRepository как Singleton.

0 голосов
/ 26 декабря 2018

Я предполагаю на основании предоставленного шаблона, что хранилище зависит от DbContext?

public class ProductRepository : IProductRepository {

    public ProductRepository (MyDbContext db) {
        //...
    }
}

Который, как правило, регистрируется как область действия.

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

Ссылка Внедрение зависимостей в ASP.NET Core: ServiceВремя жизни

...