我是新在這(我還在學習),我想,如果你絕地大師在那裏可以幫助我走出這個問題和關注很欣賞我有。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);
}
}
是的,如果您沒有指定範圍,則默認爲瞬態範圍。 瞬態範圍意味着ninject不保留對創建對象的引用。只要你不再提及它,它就會被GC收集垃圾。 – BatteryBackupUnit
BatteryBackupUnit:謝謝你的澄清...如果它沒有保留對創建對象的引用...我的代碼應該是安全的內存泄漏,然後呢?使用InRequestScope會更好嗎? – Peter
是的,除非你保持一個比需要更長的引用,瞬態範圍意味着不會有內存泄漏。 – BatteryBackupUnit