EF 7 (중핵). AddTransient와 같은 DBContext를 만듭니다.

asp.net-core asp.net-core-mvc c# entity-framework-core

문제

문서에 따르면 DbContext를 아래와 같이 DI를 구성 할 때 (http 요청 당) 범위에 등록합니다.

services.AddEntityFramework()
   .AddSqlServer()
   .AddDbContext<DBData>(options => {
        options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]);                    
    }
);

다른 스레드에서 액세스하려고 할 때 문제가 나타납니다.

services.AddEntityFramework()
   .AddSqlServer()
   .AddDbContext<DBData>(options => {
        options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]);                    
    }
);

각 호출 (AddTransition)마다 DbContext 생성을 구성하려고합니다. 다음 코드를 작성할 수있는 기회를줍니다.

services.AddEntityFramework()
   .AddSqlServer()
   .AddDbContext<DBData>(options => {
        options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]);                    
    }
);

그래서 지금 내가 사용 요청에 따라 DBContext 만들려면 IUnitOfWorkFactoryPerRequest , 나는 몇 가지 배경 스레드에서 DBContext을 사용할 때 사용할 수 IUnitOfWorkFactoryPerCall .

수락 된 답변

내 임시 솔루션. 컨텍스트를 "일시적인 방식으로"만들 수있는 싱글 톤을 만들었습니다.

public class AppDependencyResolver
{
    private static AppDependencyResolver _resolver;

    public static AppDependencyResolver Current
    {
        get
        {
            if (_resolver == null)
                throw new Exception("AppDependencyResolver not initialized. You should initialize it in Startup class");
            return _resolver;
        }
    }

    public static void Init(IServiceProvider services)
    {
        _resolver = new AppDependencyResolver(services);
    }

    private readonly IServiceProvider _serviceProvider;

    public AppDependencyResolver(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }

    public IUnitOfWorkFactory CreateUoWinCurrentThread()
    {
        var scopeResolver = _serviceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope();
        return new UnitOfWorkFactory(scopeResolver.ServiceProvider.GetRequiredService<DBData>(), scopeResolver);
    }
}

그런 다음 Startup Configure 메소드에서 init 메소드를 호출합니다.

public class AppDependencyResolver
{
    private static AppDependencyResolver _resolver;

    public static AppDependencyResolver Current
    {
        get
        {
            if (_resolver == null)
                throw new Exception("AppDependencyResolver not initialized. You should initialize it in Startup class");
            return _resolver;
        }
    }

    public static void Init(IServiceProvider services)
    {
        _resolver = new AppDependencyResolver(services);
    }

    private readonly IServiceProvider _serviceProvider;

    public AppDependencyResolver(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }

    public IUnitOfWorkFactory CreateUoWinCurrentThread()
    {
        var scopeResolver = _serviceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope();
        return new UnitOfWorkFactory(scopeResolver.ServiceProvider.GetRequiredService<DBData>(), scopeResolver);
    }
}

그리고 결국 일부 백그라운드 스레드에서 AppDependencyResolver.Current.CreateUoWinCurrentThread() 를 호출 할 수 있습니다.

누군가가 더 우아한 해결책을 제공 할 수 있다면 나는 인정 될 것이다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.