asp.net-mvc-3 - 自定义成员资格 + Ninject + InRequestScope = ObjectContext 实例已被处置

标签 asp.net-mvc-3 dependency-injection ninject dbcontext custom-membershipprovider

ObjectContext 实例已在 InRequestScope 中释放!

我在网络上尝试了几个小时,试图解决一个问题。

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

我发现有几篇文章和帖子有同样的问题,如 this , this , thisthis

我尝试了所有方法,但总是出现错误。


代码

上下文

public class BindSolutionContext : DbContext
{
    public DbSet<Project> Projects { get; set; }
    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }
    public DbSet<Address> Addresses { get; set; }
    public DbSet<ProjectImage> ProjectImages { get; set; }

    public BindSolutionContext()
        : base("name=Data")
    {
        Database.SetInitializer(new DropCreateDatabaseIfModelChanges<BindSolutionContext>());
    }
}

注入(inject)

kernel.Bind<BindSolutionContext>().ToSelf().InRequestScope();

kernel.Bind<IProjectRepository>().To<ProjectRepository>().InRequestScope();
kernel.Bind<IUserRepository>().To<UserRepository>().InRequestScope();
kernel.Bind<IRoleRepository>().To<RoleRepository>().InRequestScope();
kernel.Bind<IAddressRepository>().To<AddressRepository>().InRequestScope();
kernel.Bind<IProjectImageRepository>().To<ProjectImageRepository>().InRequestScope();

存储库

public class ProjectRepository : IProjectRepository
{
    private readonly BindSolutionContext _context;

    public ProjectRepository(BindSolutionContext context)
    {
        _context = context;
    }

    public IQueryable<Project> Query(params Expression<Func<Project, object>>[] includeProperties)
    {
        return includeProperties.Aggregate<Expression<Func<Project, object>>,
            IQueryable<Project>>(_context.Projects, (current, includeProperty) => current.Include(includeProperty));
    }

    public IQueryable<Project> Query(int pageIndex, int pageSize, params Expression<Func<Project, object>>[] includeProperties)
    {
        return includeProperties.Aggregate<Expression<Func<Project, object>>,
            IQueryable<Project>>(_context.Projects, (current, includeProperty) => current.Include(includeProperty)).OrderBy(p => p.Name).Skip(pageIndex).Take(pageSize);
    }

    //Rest of Implementation
}

ProjectImageRepositoryAddressRepositoryRoleRepositoryUserRepository 实现遵循相同的模型!

public class BindUserProvider : MembershipProvider
{
    [Inject]
    public IUserService UserService { get; set; }

    //Rest of implementation
}


public class BindRoleProvider : RoleProvider
{
    private IRoleService _roleServ;
    private IRoleService RoleServ { get { return _roleServ ?? (_roleServ = DependencyResolver.Current.GetService<IRoleService>()); } }

    private IUserService _userServ;
    private IUserService UserServ { get { return _userServ ?? (_userServ = DependencyResolver.Current.GetService<IUserService>()); } }

    //Rest of implementation
}

由于范围是请求,Ninject 应该在请求结束时处理对象。但在某些情况下,处置发生在完成请求之前。

尝试

我不确定问题是否与自定义成员有关,但做了一些测试。如下:

注入(inject)

kernel.Bind<BindSolutionContext>().ToSelf().InTransientScope();

kernel.Bind<IProjectRepository>().To<ProjectRepository>().InSingletonScope();
kernel.Bind<IUserRepository>().To<UserRepository>().InSingletonScope();
kernel.Bind<IRoleRepository>().To<RoleRepository>().InSingletonScope();
kernel.Bind<IAddressRepository>().To<AddressRepository>().InSingletonScope();
kernel.Bind<IProjectImageRepository>().To<ProjectImageRepository>().InSingletonScope();

所以没有更多的错误!

但是另一个问题出现了!由于 repositorycontext 是单例对象,因此不会更新。

例如,如果我为项目注册了一个新地址,集合 project.Addresses 不会更新!

注意:地址在数据库中注册没有任何问题!

最佳答案

Membership 和 RoleProvider 的生命周期比请求长。对象永远不应依赖于较短生命周期的对象(除非在方法执行期间在本地创建和销毁),因为它们最终会引用已处置的对象。

由于您希望每个请求都有一个新的上下文以避免缓存对象,因此您不能将上下文注入(inject)存储库,而是通过方法调用从外部传递它,并在服务中创建它,或者使用工厂在提供者中创建它。

关于asp.net-mvc-3 - 自定义成员资格 + Ninject + InRequestScope = ObjectContext 实例已被处置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8452904/

相关文章:

asp.net-mvc-3 - ASP.Net MVC 和本地 IIS 问题加载样式表

c# - 有没有办法注入(inject)/交换扩展?

如果没有 @Provides-annotated 方法,就无法提供 android.content.Context

asp.net-mvc - 为什么 Ninject 在部署到 Azure 时会抛出 "did not return a controller"异常?

c# - MVC 网址路由

c# - Ninject 中的泛型和属性绑定(bind)

asp.net - 如何在 ASP.NET 中阻止 Http 方法

dependency-injection - Ninject 内核范围

asp.net-mvc-3 - 将 mvc-mini-profiler 与 EF 4.0 和 Ninject 结合使用

c# - Ninject Conventions 是否仅适用于公共(public)类(class)?