2016-02-16 1 views
0

J'ai lu ce post DbContext has been disposed and autofac mais je reçois toujours la même erreur:Autofac DbContext a été disposé

The operation cannot be completed because the DbContext has been disposed.

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); 
    } 
} 

Et dans le 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)); 

injection contrôleur :

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"); 
    } 
} 

T poule 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); 
    ............ 
    ............ 
    } 

Répondre

2

Vous devez vous inscrire lui-même DbContext avec AutoFac et lui donner la durée de vie appropriée. InstancePerDependency est généralement bien pour les dépôts.

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

Ensuite, vous n'avez pas besoin de donner l'enregistrement d'un objet référentiel, enregistrez le type (ne pas oublier de préciser la durée de vie ainsi):

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

Steve Merci pour la suggestion, j'ai essayé builder.RegisterType () .AsSelf(). InstancePerDependency(); builder.RegisterType (). Comme () .InstancePerLifetimeScope(); Mais toujours obtenir la même erreur. –

+0

@ AlexanderC.how appelez-vous réellement la méthode de référentiel? – Steve

+0

via l'injection de dépendances du contrôleur et l'injection de dépendances dans d'autres services builder.RegisterType (). En tant que (). InstancePerLifetimeScope(); –