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

Filters não funciona

Boa tarde, modifiquei as classes conforme orientado, mas quando comento na classe ProdutoDao public void Adiciona(Produto produto) { this.contexto.Produtos.Add(produto); // this.contexto.SaveChanges(); } o SaveChanges o produto deixa de ser persistido, ou seja, o filtro não funcionando. Segue classes comom e filters.

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

namespace LojaWebEF.Filters { public class SaveChangesFilter : ActionFilterAttribute { private EntidadesContext contexto; public SaveChangesFilter(EntidadesContext contexto) { this.contexto = contexto; } / public override void OnActionExecuted(ActionExecutedContext filterContext) { if (contexto. == null) { // se não ocorreu nenhum erro, então grave as modificações contexto.SaveChanges(); } contexto.Dispose(); }/

public override void OnActionExecuted(ActionExecutedContext filterContext) { if (filterContext.Exception == null) { // se não ocorreu nenhum erro, então grave as modificações this.contexto.SaveChanges(); } this.contexto.Dispose(); }

public override void OnResultExecuted(ResultExecutedContext filterContext) { if (filterContext.Exception == null) { this.contexto.SaveChanges(); } this.contexto.Dispose(); }

} }

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(LojaWebEF.App_Start.NinjectWebCommon), "Start")] [assembly: WebActivatorEx.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 LojaWebEF.Filters; using Ninject.Web.Mvc.FilterBindingSyntax; using System.Web.Mvc; using Ninject.Web.Mvc.FilterBindingSyntax;

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

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

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

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

RegisterServices(kernel); return kernel; } catch { kernel.Dispose(); throw; } }

/// /// Load your modules or register your services here! /// ///

The kernel. private static void RegisterServices(IKernel kernel) { // registro dos outros componentes int ordemExecucao = 1; kernel.BindFilter(FilterScope.Global, ordemExecucao);

// kernel.Bind().ToSelf().InRequestScope(); }

} }

5 respostas

Olá Rodrigo

Coloque seu código dentro de ``` para que a formatação apareça corretamente. Da forma que está eu não consigo testar se o seu código está realmente compilando.

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

namespace LojaWebEF.Filters
{
    public class SaveChangesFilter  : ActionFilterAttribute
    {
        private EntidadesContext contexto;
        public SaveChangesFilter(EntidadesContext contexto)
        {
            this.contexto = contexto;
        }
   /*     public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            if (contexto. == null)
            {
                // se não ocorreu nenhum erro, então grave as modificações
                contexto.SaveChanges();
            }
            contexto.Dispose();
        }*/


        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            if (filterContext.Exception == null)
            {
                // se não ocorreu nenhum erro, então grave as modificações
                this.contexto.SaveChanges();
            }
            this.contexto.Dispose();
        }

      public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            if (filterContext.Exception == null)
            {
                this.contexto.SaveChanges();
            }
            this.contexto.Dispose();
        }








    }
}
[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(LojaWebEF.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivatorEx.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 LojaWebEF.Filters;
    using Ninject.Web.Mvc.FilterBindingSyntax;
    using System.Web.Mvc;
    using Ninject.Web.Mvc.FilterBindingSyntax;


    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();
            try
            {
                kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
                kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

                RegisterServices(kernel);
                return kernel;
            }
            catch
            {
                kernel.Dispose();
                throw;
            }
        }

        /// <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();
            // registro dos outros componentes
           int ordemExecucao = 1;
            kernel.BindFilter<SaveChangesFilter>(FilterScope.Global, ordemExecucao);


        }        






    }
}

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 contexto) { this.contexto = contexto; }

public void Adiciona(Produto produto) { this.contexto.Produtos.Add(produto); // this.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 contexto.Produtos.Find(id); }

public IEnumerable Lista() {

return this.contexto.Produtos; }

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

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

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

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

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


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 contexto)
        {
            this.contexto = contexto;
        }

        public void Adiciona(Produto produto)
        {
            this.contexto.Produtos.Add(produto);
          //  this.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 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>();
        }
    }
}
solução!

Olá Rodrigo

No código do RegisterServices do NinjectWebCommon você precisa manter a linha que registra o contexto do entity framework descomentada.

O seu problema aconteceu por que o ninject por padrão cria um objeto novo toda vez que ele precisa fazer a injeção de dependências, ou seja o DAO e o filtro estão com uma instância diferente do Contexto do entity framework e por isso as mudanças não estão sendo gravadas no banco de dados.

Além disso, você também precisa modificar o código do filtro tirando a chamada para o Dispose do método OnActionExecuted.

Funcionou!!