2013-07-16 43 views
1

我是新在這(我還在學習),我想,如果你絕地大師在那裏可以幫助我走出這個問題和關注很欣賞我有。Ninject瞬態範圍+範圍處置+垃圾收集+內存泄漏

我想使用Ninject,我有下面的代碼,我想知道是否我的物體會妥善處理和垃圾收集。

對於Ninject的默認瞬態範圍,我讀了「終身不被內核管理(該範圍對象爲空),並永遠不會被處理完畢。」

如果我會用我的代碼在生產,特別是當我得到很多併發呼叫我的WebAPI(POST),它會導致像內存泄漏等任何問題?

什麼是最好的Ninject的對象範圍用於這種情況?

順便說一句,如果我不喜歡指定對象範圍「kernel.Bind()至();」,將默認爲TransientScope?

public class VehicleClassRepository : IVehicleClassRepository 
{ 
    SomeDataContext context = new SomeDataContext(); 

    public IQueryable<VehicleClass> All 
    { 
     get { return context.VehicleClasses; } 
    } 

    public IQueryable<VehicleClass> AllIncluding(params Expression<Func<VehicleClass, object>>[] includeProperties) 
    { 
     IQueryable<VehicleClass> query = context.VehicleClasses; 
     foreach (var includeProperty in includeProperties) { 
      query = query.Include(includeProperty); 
     } 
     return query; 
    } 

    public VehicleClass Find(int id) 
    { 
     return context.VehicleClasses.Find(id); 
    } 

    public void InsertOrUpdate(VehicleClass vehicleclass) 
    { 
     if (vehicleclass.VehicleClassId == default(int)) { 
      // New entity 
      context.VehicleClasses.Add(vehicleclass); 
     } else { 
      // Existing entity 
      context.Entry(vehicleclass).State = EntityState.Modified; 
     } 
    } 

    public void Delete(int id) 
    { 
     var vehicleclass = context.VehicleClasses.Find(id); 
     context.VehicleClasses.Remove(vehicleclass); 
    } 

    public void Save() 
    { 
     context.SaveChanges(); 
    } 

    public void Dispose() 
    { 
     context.Dispose(); 
    } 
} 

public interface IVehicleClassRepository : IDisposable 
{ 
    IQueryable<VehicleClass> All { get; } 
    IQueryable<VehicleClass> AllIncluding(params Expression<Func<VehicleClass, object>>[] includeProperties); 
    VehicleClass Find(int id); 
    void InsertOrUpdate(VehicleClass vehicleclass); 
    void Delete(int id); 
    void Save(); 
} 

在我NinjectWebCommon.cs:

private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind<IVehicleClassRepository>().To<VehicleClassRepository>(); 
    } 

在我的WebAPI的VehicleClassController.cs:

public HttpResponseMessage Post(VehicleClass value) 
{ 
     if (value == null) 
     { 
      return new HttpResponseMessage(HttpStatusCode.BadRequest); 
     } 
     else 
     { 
      vehicleclassRepository.InsertOrUpdate(value); 
      vehicleclassRepository.Save(); 
      return new HttpResponseMessage(HttpStatusCode.Created); 
     } 
} 
+1

是的,如果您沒有指定範圍,則默認爲瞬態範圍。 瞬態範圍意味着ninject不保留對創建對象的引用。只要你不再提及它,它就會被GC收集垃圾。 – BatteryBackupUnit

+0

BatteryBackupUnit:謝謝你的澄清...如果它沒有保留對創建對象的引用...我的代碼應該是安全的內存泄漏,然後呢?使用InRequestScope會更好嗎? – Peter

+0

是的,除非你保持一個比需要更長的引用,瞬態範圍意味着不會有內存泄漏。 – BatteryBackupUnit

回答

1

遲到的回答(近2年),但在其他情況下,讀這...

儘管垃圾收集器最終會處理您的VehicleClassRepositor例如,你很可能在那之前遇到問題。

您的數據上下文可能會保留一個打開的數據庫連接,直到它被丟棄。數據庫連接可能來自數據庫連接池。

這麼久的CLR結束了垃圾回收這些(這也將處理掉),傳入的請求結束,而試圖獲得一個數據庫連接,但沒有符合條件的阻塞之前。

我遇到過這種類型的行爲,並從中學到了困難的方法。因此,VehicleClassRepository應該在依賴範圍內定義範圍,以便每次調用都能獲得一個,更重要的是,它將在調用完成後立即處理。