Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Exercício capitulo 2 injeção de dependência

Injeção de dependencia!!

com erro... "An exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll but was not handled in user code

Additional information: The operation cannot be completed because the DbContext has been disposed."

Não consegui aplicar a injeção de dependencia para elimitaro o Savechage.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace LojaWebEF.Filters
{
    public class SaveChangesFilter : System.Web.Mvc.ActionFilterAttribute
    {
        private EntidadesContext contexto;
        public SaveChangesFilter(EntidadesContext contexto)
        {
            this.contexto = contexto;
        }
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            this.contexto.SaveChanges();
            this.contexto.Dispose();
        }
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            if (filterContext.Exception == null)
            {
                this.contexto.SaveChanges();
            }
            this.contexto.Dispose();
        }
    }
}
[assembly: WebActivator.PreApplicationStartMethod(typeof(LojaWebEF.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(LojaWebEF.App_Start.NinjectWebCommon), "Stop")]

namespace LojaWebEF.App_Start
{
    using System;
    using System.Web;

    using Microsoft.Web.Infrastructure.DynamicModuleHelper;

    using Ninject;
    using Ninject.Web.Common;
    using Ninject.Web.Mvc.FilterBindingSyntax;
    using LojaWebEF.Filters;
    using System.Web.Mvc;

    public static class NinjectWebCommon 
    {
        private static readonly Bootstrapper bootstrapper = new Bootstrapper();

        /// <summary>
        /// Starts the application
        /// </summary>
        public static void Start() 
        {
            DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
            DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
            bootstrapper.Initialize(CreateKernel);
        }

        /// <summary>
        /// Stops the application.
        /// </summary>
        public static void Stop()
        {
            bootstrapper.ShutDown();
        }

        /// <summary>
        /// Creates the kernel that will manage your application.
        /// </summary>
        /// <returns>The created kernel.</returns>
        private static IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
            kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

            RegisterServices(kernel);
            return kernel;
        }

        /// <summary>
        /// Load your modules or register your services here!
        /// </summary>
        /// <param name="kernel">The kernel.</param>
        private static void RegisterServices(IKernel kernel)
        {
                kernel.Bind<EntidadesContext>().ToSelf().InRequestScope();

                //utillizacao de filtro para salvar Bd
                int ordemExecucao = 1;
                kernel.BindFilter<SaveChangesFilter>(FilterScope.Global, ordemExecucao);




        } 

    }
}

No ProdutoDao so testei no adiciona mas n funciona

using LojaWebEF.Entidades;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;

namespace LojaWebEF.DAO
{
    public class ProdutosDAO
    {
        private EntidadesContext contexto;

        public ProdutosDAO(EntidadesContext context)
        {
            this.contexto = context;
        }

        public void Adiciona(Produto produto)
        {
            contexto.Produtos.Add(produto);
         //   contexto.SaveChanges();

        }

        public void Remove(Produto produto)
        {
            this.contexto.Produtos.Remove(produto);
            this.contexto.SaveChanges();
        }

        public void Atualiza(Produto produto)
        {
            this.contexto.Entry(produto).State = EntityState.Modified;
            this.contexto.SaveChanges();
        }

        public Produto BuscaPorId(int id)
        {
            return this.contexto.Produtos.Find(id);
        }

        public IEnumerable<Produto> Lista()
        {
            return this.contexto.Produtos;
        }

        public IEnumerable<Produto> ProdutosComPrecoMaiorDoQue(decimal? preco)
        {
            return new List<Produto>();
        }

        public IEnumerable<Produto> ProdutosDaCategoria(string nomeCategoria)
        {
            return new List<Produto>();
        }

        public IEnumerable<Produto> ProdutosDaCategoriaComPrecoMaiorDoQue(decimal? preco, string nomeCategoria)
        {
            return new List<Produto>();
        }

        public IEnumerable<Produto> ListaPaginada(int paginaAtual)
        {
            return new List<Produto>();
        }

        public IEnumerable<Produto> BuscaPorPrecoCategoriaENome(decimal? preco, string nomeCategoria, string nome)
        {
            return new List<Produto>();
        }
    }
}

poderia me ajudar?? e me indicar mais informação de injeção de dependencia??

4 respostas
solução!

Olá Rodrigo

O problema no seu código é que o método SaveChanges está sendo invocado depois de uma chamada para o Dispose.

Quando utilizamos um filtro do asp.net mvc, a ordem de execução da requisição fica da seguinte forma: Primeiro o Asp.Net MVC chama o OnActionExecuting, depois disso a action do controller é invocada, em seguida o OnActionExecuted é chamado, seguido do OnResultExecuting e, por fim, o OnResultExecuted para finalizar o tratamento da requisição web.

Veja que no seu OnActionExecuted você está chamando o Dispose do contexto e depois no OnResultExecuted você está tentando salvar as modificações em um contexto que já foi fechado no OnActionExecuted e por isso o Entity Framework está lançando a exceção.

Como ficaria a classe por inteira só para eu comparar com a minha???

vitor ja entendi sua explicação, mt obrigado!!!!

abs!!!

Olá Rodrigo

Você poderia marcar a resposta como solução?