2016-12-14 36 views
1

我正在研究一個80%完成的大項目(雖然有些功能需要實現)。但是最近我們發現該項目不允許併發請求(我的意思是多個用戶請求同一個存儲庫)。有時我們會得到空引用&有時「執行無法打開可用連接,連接狀態已關閉」等。 我們的源代碼嚴格限制在世界之外。這裏有一些代碼。讓我知道是否有任何建築問題,因爲建築傢伙離開了公司。它使用ninject 3.0。我已經使用InRequestScope()的所有經理的庫,但沒有運氣DbContext with Ninject ADO.NET

更新:我沒有使用任何ORM這裏,我試圖通過數據適配器在我的DbContext類連接SqlServer的

public class DbContext 
{ 
    //execute query , nonquery etc using adapter & datatable 
    //Example 
    var dt=new DataTable(); 
    _adapter=new _dbfactory.CreateAdapter(); 
    _adapter.Fill(dt); 
    return dt; 
} 
//MyController 
public class MyController 
    { 
     private readonly IMyManager_iMyManager; 
     public MyController(IMyManager iMyManager){_iMyManager=iMyManager} 

     public ActionResult Save() 
     { 
      _iMyManager.Save() 
     } 
    } 
// My Manager 
    public class MyManager:IMyManager 
    { 
     private readonly IMyRepository _iMyRepository; 
     DbContext _dbContext=new  
       DbContext("someParameter","connectionstring"); 

    public MyManager 
     (
     IMyRepository iMyRepository, DbContext dbContext 
     )      
     {  
     _iMyRepository=iMyRepository; 
     _dbContext=dbContext; 
     } 

    Public DataTable GetDataTable() 
    { 
    try 
    { 
     _dbContext.Open(); 
     _iMyRepository.GetDataTable() 
    } 
    catch(Exception ex){} 
    finally{_dbContext.Close()} 
    } 
} 

//這裏是倉庫

Public class MyRepository:IMyRepository 
    { 
     public _dbContext; 
     public MyRepository(DbContext dbContext) 
     { 
     _dbContext=dbContext; 
     } 

     public DataTable GetDataTable() 
     { return _dbContext.ExecuteQuery()} 
    } 

最後這是我們ninject結合

public class NinjectDependencyResolver() 
{ 
    var context=new DbContext("someparameter","connectionStrin"); 
    kernel.Bind<IMyManager>().To<MyManager>().WithConstructorArgument("_dbContext",context); 
    kernel.Bind<IMyRepository >().To<MyRepository >().WithConstructorArgument("_dbContext",context); 
} 

有可能有一些錯字在我的代碼,我寫了一切,所以編輯

+0

你能提供更多的細節嗎?您是否使用任何ORM(例如EF6)來訪問數據庫?哪個版本?或者你是否試圖使用本地驅動程序直接連接到數據庫,哪一個? Sql Server,Oracle等? – Vinod

+0

在這一行中,空引用出現?你的Controller只調用Save方法。如果您也提供該方法的來源,這將有所幫助。 –

回答

3

我覺得你在Ninject Dependency Resolver中做得太複雜了。

您不應該使用新的關鍵字創建DbContext。相反,您應該讓Ninject在線程範圍的請求範圍或中解決DbContext

要註冊的DbContext,你可以做這樣的:

kernel.Bind<DbContext>().To<MyDbContext>().WithConstructorArgument("someArgument", "someValue").InRequestScope(); 
kernel.Bind<IMyManager>().To<MyManager>().InRequestScope(); 
kernel.Bind<IMyRepository>().To<MyRepository>().InRequestScope(); 

你並不需要精確的構造函數參數的DbContext作爲的DbContext只能註冊一次在Ninject。

您也可以註冊的DbContext到DbContextProvider類和那裏你可以添加一些特定的邏輯來解決對象。

例子:

kernel.Bind<DbContext>().ToProvider<MyDbContextProvider>().InRequestScope(); 

internal class MyDbContextProvider : Ninject.Activation.IProvider 
{ 
    public object Create(IContext context) 
    { 
     return new MyDbContext("connectionStringArgument"; 
    } 

    public Type Type { get { return typeof (MyDbContext); } } 
} 

我希望這有助於。

0

如果要初始化一些在該領域的水平,那麼爲什麼你會從構造函數重新初始化呢?

private readonly IMyRepository _iMyRepository;  
DbContext _dbContext=new DbContext("someParameter","connectionstring"); 

public MyManager(IMyRepository iMyRepository, DbContext dbContext)      
{  
    _iMyRepository=iMyRepository; 
    _dbContext=dbContext; 
} 

這也可能是一個錯字。從構造函數中刪除_dbContext初始化或將初始化任務委託給此類的調用者。

多個初始化也可能是問題。因爲你正在NinjectDependencyResolver()和MyManager中進行dbcontext初始化。爲此,你會得到兩個不同的例外。這是一個平臺設計問題,我猜

+0

我明白你說了什麼,但問題是我們項目的其他部分(另一個團隊的子項目使用初始化的_dbContext,我知道這是一團糟)。我會做一個測試。 –

+0

多次初始化也可能是問題。因爲你正在NinjectDependencyResolver()和MyManager中進行dbcontext初始化。爲此,你有兩個不同的例外,這是一個平臺設計問題,我猜 –

0

你需要刪除MyManager這個初始化,因爲你通過IoC傳遞初始化的DbContext。

DbContext _dbContext=new  
      DbContext("someParameter","connectionstring"); 

您還需要去掉finally塊在GetDataTable在MyManager類,因爲作爲一個經驗法則,如果對象是通過IoC的初始化時,它應該由國際奧委會也被銷燬。

finally{_dbContext.Close()} 
+0

好吧。讓我嘗試 。但Ninject的人告訴我,我在NinjectDependencyResolver類中做了什麼是錯誤的,並沒有處理Ninject var context = new DbContext(「someparameter」,「connectionStrin」); } –

0

兩個問題:

// My Manager 
public class MyManager:IMyManager 
{ 
    private readonly IMyRepository _iMyRepository; 
    DbContext _dbContext=new  
      DbContext("someParameter","connectionstring"); 

public MyManager 
    (
    IMyRepository iMyRepository, DbContext dbContext 
    )      
    {  
    _iMyRepository=iMyRepository; 
    _dbContext=dbContext; 
    } 

是爲字段創建新時調用構造函數將被覆蓋。

public class NinjectDependencyResolver() 
{ 
    var context=new DbContext("someparameter","connectionStrin"); 
    kernel.Bind<IMyManager>().To<MyManager>().WithConstructorArgument("_dbContext",context); 
    kernel.Bind<IMyRepository >().To<MyRepository >().WithConstructorArgument("_dbContext",context); 
} 

您在此處創建上下文並將其傳遞給每個對象創建。因此,您仍在重複使用上下文對象,而不是爲每個請求範圍創建它。

+0

我明白如何解決第一個問題。爲了解決第二個,我應該這樣做kernel.Bind ()。爲了().WithConstructorArgument( 「_的DbContext」,新的DbContext( 「someparameter」, 「connectionStrin」)); –

相關問題