0

我使用[庫& UOW]模式與EF核心工作。爲什麼在EF核心中的每個API調用之後自動處理DbContext?

問題

大部分時間裏,每一個成功的呼叫上下文配置&拋出錯誤之後。

擴展方法

public static IServiceCollection AddDataAccessConfig<C>(this IServiceCollection services) where C : DbContext 
     { 
      RegisterDataAccess<C>(services); 
      return services; 
     } 
private static void RegisterDataAccess<C>(IServiceCollection services) where C : DbContext 
     { 
      services.TryAddScoped<IUnitOfWork<C>, UnitOfWork<C>>(); 
     } 

ConfigureServices

//Register Context   
      services.AddDataAccessConfig<MyDbContext>(); 
      services.AddDbContext<MyDbContext>(options => 
      { 
       options.UseSqlServer(Configuration.GetConnectionString("DbCon")); 

      }); 
//Register Repository  
      services.TryAddScoped<IUserRepository, UserRepository>(); 

我曾嘗試與婁代碼。但沒有運氣

TryAddTransient

services.TryAddTransient<IUserRepository, UserRepository>(); 

庫基地

protected RepositoryBase(IUnitOfWork<C> unitOfWork) 
     { 
      UnitOfWork = unitOfWork; 

      _dbSet = UnitOfWork.GetContext.Set<E>(); // THIS LINE THROW ERROR 

     } 

UOW

public UnitOfWork(C dbcontext) 
     { 
      _dbContext = dbcontext; 
     } 
public C GetContext 
     { 
      get { return _dbContext; } 
     } 

樣品呼叫服務

public IActionResult ByUser(string uid, string pwd) 
     { 
var result = _userRepository.GetValidUser(uid, pwd); 


        if (string.IsNullOrEmpty(result)) 
        { 
         return Request.CreateResponse(HttpStatusCode.Unauthorized); 
        } 
        else 
        { 
         return Request.CreateResponse(HttpStatusCode.OK, JsonConvert.SerializeObject(result)); 
        } 


} 
+1

你是什麼意思的「每一個電話後」?告訴我們這個代碼,你有什麼問題。 – DavidG

+5

'使用[Repository&UOW]模式來處理EF Core' <=爲什麼? DbContext類型是一個UoW模式的實現,'DbSet類型是一個Repository模式的實現。爲什麼在你自己的相同模式實現中重新包裝這些類型?你沒有增加任何有價值的東西,只是增加了更多的代碼和抽象,這使得很難閱讀,調試和使用這些類型。 – Igor

+0

@DavidG:我更新了我的帖子 –

回答

2

改變你的DbContext的壽命IUserRepository不會影響壽命。有overloadAddDbContext,允許您指定DbContext的生命週期。例如

services.AddDbContext<MyDbContext>(options => 
{ 
    options.UseSqlServer(Configuration.GetConnectionString("DbCon")); 
}, ServiceLifetime.Transient); 

默認ServiceLifetime.Scoped如果你是一個ASP.NET的核心應用內唯一真正行之有效。有關更多信息,請參閱here

+3

作爲單例的db上下文將是一個非常糟糕的主意。 – DavidG

+0

@KirkLarkin:感謝您的解決方案。 –

+0

這究竟是如何解決問題的? –

相關問題