1

我是这方面的新手(我还在学习),如果你们那里的绝地大师能帮助我解决我的问题和担忧,我将不胜感激。

我想使用 Ninject 并且我有下面的代码,我想知道我的对象是否会被正确处理和垃圾收集。

对于 Ninject 的默认 Transient Scope,我读到“Lifetime 不由 Kernel 管理(Scope 对象为 null),永远不会被 Disposed。”

如果我想在生产中使用我的代码,特别是当我收到大量对我的 WebApi (POST) 的并发调用时,它会导致内存泄漏等问题吗?

在这种情况下,最好的 Ninject 对象范围是什么?

顺便说一句,如果我不指定像“kernel.Bind().To();”这样的对象范围,它会默认为 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);
        }
}
4

1 回答 1

1

迟到的答案(差不多 2 年),但万一其他人读到这个......

尽管垃圾收集器最终会处理您的 VehicleClassRepository 实例,但在此之前您很可能会遇到问题。

您的数据上下文可能会保持一个打开的数据库连接,直到它被释放。数据库连接可能来自数据库连接池。

在 CLR 结束垃圾收集这些(也会处理它们)之前很久,传入的请求最终会在尝试获取数据库连接时阻塞,但没有可用的连接。

我遇到过这种行为,并从中吸取了教训。因此,VehicleClassRepository 的范围应该在依赖范围内,以便每次调用都能获得一个,更重要的是,它会在调用完成后立即被释放。

于 2015-02-19T07:11:43.730 回答