【问题标题】:Autofac DbContext has been disposedAutofac DbContext 已被释放
【发布时间】:2016-05-27 03:23:28
【问题描述】:

我已经阅读了这篇文章DbContext has been disposed and autofac,但我仍然遇到同样的错误:

操作无法完成,因为 DbContext 已被释放。

public class EFRepository : IRepository
{
    private EFDbContext context;

    public EFRepository(EFDbContext ctx)
    {
        context = ctx;
    }

    public TEntity FirstOrDefault<TEntity>(Expression<Func<TEntity, bool>> predicate, params Expression<Func<TEntity, object>>[] includes)
        where TEntity : class, IContextEntity
    {
        IQueryable<TEntity> query = includes.Aggregate<Expression<Func<TEntity, object>>, IQueryable<TEntity>>
                     (context.Set<TEntity>(), (current, expression) => current.Include(expression));            

        return query.FirstOrDefault(predicate);
    }
}

在 Global.asax 中

ContainerBuilder builder = new ContainerBuilder();
builder.RegisterControllers(typeof(MvcApplication).Assembly);

builder.Register<IRepository>(c => new EFRepository(new EFDbContext()));

ILifetimeScope container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

控制器注入:

public class AccountController : Controller
{
    private readonly IRepository repository;
    private readonly IMembershipService membershipService;        

    public AccountController(IRepository repo, IMembershipService mmbrSvc)
    {
        repository = repo;
        membershipService = mmbrSvc;
    }
    [HttpPost]        
    public ActionResult Login(LoginViewModel viewModel)
    {
        if (!ModelState.IsValid)             
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);            

        string returnUrl = (string)TempData["ReturnUrl"];
        LoginDto accountDto = viewModel.GetLoginStatus(repository, membershipService, returnUrl);
        string accountDtoJson = JsonHelper.Serialize(accountDto);

        return Content(accountDtoJson, "application/json");
    }
}

然后在 LoginViewModel 中:

public LoginDto GetLoginStatus(IRepository repo, IMembershipService mmbrSvc, string returnUrl)
    {
        repository = repo;
        membershipService = mmbrSvc;

        User user = repository.FirstOrDefault<User>(x => x.Username == Username, x => x.Membership);
    ............
    ............
    }

【问题讨论】:

    标签: c# asp.net-mvc autofac ioc-container


    【解决方案1】:

    您需要向 AutoFac 注册 DbContext 本身并为其提供适当的生命周期。 InstancePerDependency 通常适用于存储库。

    builder.RegisterType<EFDbContext>().AsSelf().InstancePerDependency();
    

    然后,你不需要给存储库注册一个对象,只需注册类型(记得指定生命周期):

    builder.Register<EFRepository>().As<IRepository>().InstancePerLifetimeScope();
    

    【讨论】:

    • 史蒂夫感谢您的建议,我尝试了 builder.RegisterType().AsSelf().InstancePerDependency(); builder.RegisterType().As().InstancePerLifetimeScope();但仍然出现同样的错误。
    • @AlexanderC.你实际上是如何调用存储库方法的?
    • 通过控制器依赖注入以及其他服务中的依赖注入 builder.RegisterType().As().InstancePerLifetimeScope();
    • @AlexanderC.你能用你的控制器构造函数和存储库调用的例子来更新你的问题吗?
    • @AlexanderC.也许尝试将您的 DbContext 注册更改为 InstancePerLifetimeScope
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多