ASP.NET Core Пользовательский уровень доступа к данным класса AddSingleton - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть мой EntityFrameworkCore DBContext в ConfigureServices

public void ConfigureServices(IServiceCollection services)
{               
    services.AddDbContext<MyDBContext>(Options => ...  );
    ...
}

У меня также есть мой фабричный класс уровня доступа к данным, который получает DBContext в конструкторе

public partial class DataAccessFactory
{
    public readonly ProductsDataAccess Products;
    public readonly CategoriesDataAccess Categories;

    public DataAccessFactory(MyDBContext db)
    {
        Products = new ProductsDataAccess(db);
        Categories = new CategoriesDataAccess(db);
    }    
}

В порядкечтобы работать с уровнем доступа к данным, мне нужно создать новый экземпляр DataAccessFactory для каждого запроса.

Мой вопрос в том, имеет ли он смысл и есть ли способ создать один экземпляр DataAccessFactory и добавить его как Singleton?

1 Ответ

0 голосов
/ 20 ноября 2018

Вы можете зарегистрировать свой сервис внутри ConfigureServices в Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddSingleton<DataAccessFactory>();
}

и добавить его туда, где вам нужно:

public class MyController
{
    public readonly DataAccessFactory Factory;

    public MyController(DataAccessFactory factory)
    {
        Factory = factory;
    }    
}

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

Обновление:

Но будьте осторожны при смешивании разныхуслуги.Вы не можете ввести короткоживущий объект в долгоживущий, потому что это вызовет исключения.В вашей ситуации вам нужно изменить область видимости DbContext на singleton (sic) или рассмотреть возможность изменения времени жизни Factory на Scoped. Здесь - пример того, как изменить область видимости DbContext.

...