Autofac DbContext已被处理

我已经阅读过这篇文章DbContext已经处理掉并且autofac但是我仍然得到同样的错误:

由于已经处理了DbContext,因此无法完成操作。

public class EFRepository : IRepository { private EFDbContext context; public EFRepository(EFDbContext ctx) { context = ctx; } public TEntity FirstOrDefault(Expression<Func> predicate, params Expression<Func>[] includes) where TEntity : class, IContextEntity { IQueryable query = includes.Aggregate<Expression<Func>, IQueryable> (context.Set(), (current, expression) => current.Include(expression)); return query.FirstOrDefault(predicate); } } 

而在Global.asax中

 ContainerBuilder builder = new ContainerBuilder(); builder.RegisterControllers(typeof(MvcApplication).Assembly); builder.Register(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(x => x.Username == Username, x => x.Membership); ............ ............ } 

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

 builder.RegisterType().AsSelf().InstancePerDependency(); 

然后,您不需要为存储库注册一个对象,只需注册该类型(记住也要指定生命周期):

 builder.Register().As().InstancePerLifetimeScope();