3
respostas

Informacoes insuficiente para entender como proceder a criancao dos filtros

Olá pessoal, Criei este Filter

using NHibernate;
using Ninject;
using Ninject.Web.Mvc;
using Ninject.Web.Mvc.FilterBindingSyntax;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http.Filters;
using System.Web.Mvc;

namespace LojaWeb.Filters
{
    public class TransactionFilter : ActionFilterAttribute // erro aqui
    {
        private ISession session;
        public TransactionFilter(ISession session)
        {
            this.session = session;
        }
        public override void OnActionExecuting(ActionExecutingContext contexto)
        {
            session.BeginTransaction();
        }

        public override void OnActionExecuted(ActionExecutedContext contexto)
        { 

            if (contexto.Exception == null)
            {
                session.Transaction.Commit();
            }
            else
            {
                session.Transaction.Rollback();
            }
            session.Close();
        }

    }
}

E também este Filter, uma vez que nao é explicado de forma alguma onde colocar este código

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

namespace LojaWeb.Filters
{
    public class NinjectWebCommon
    {
        private static void RegisterServices(IKernel kernel)
        {
            // registro dos outros componentes
            int ordemExecucao = 1;
            kernel.BindFilter<TransactionFilter>(FilterScope.Global, ordemExecucao);
        }
    }
}

Fiz a retificacao nos DAO

A pergunta está totalmente confusa. V i que outra pessoa postou perguntando onde por o código e nao recebeu resposta lucida.

Entao fiz da forma mencionada acima...

Error 17 'ActionFilterAttribute' is an ambiguous reference between 'System.Web.Http.Filters.ActionFilterAttribute' and 'System.Web.Mvc.ActionFilterAttribute' C:\Users\graziela\Desktop\Alura\NHibernate\LojaWeb\LojaWeb\Filters\TransactionFilter.cs 16 38 LojaWeb

Agradeco ajuda

3 respostas

Oi, Graziela.

A classe TransactionFilter fica na pasta Filters exatamente como você fez pelo seu exemplo. Ela não está errada.

Porém a classe NinjectWebCommon ela já existe no projeto LojaWeb que você fez o download. Diferente da TransactionFilter, ela fica na pasta App_Start.

Ao invés de criar uma nova, altere a que já existe nessa pasta. Sua NinjectWebCommon deve ficar assim:

[assembly: WebActivator.PreApplicationStartMethod(typeof(LojaWeb.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(LojaWeb.App_Start.NinjectWebCommon), "Stop")]

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

    using Microsoft.Web.Infrastructure.DynamicModuleHelper;

    using Ninject;
    using Ninject.Web.Common;

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

Note que no final da classe, tem o método RegisterServices. Foi nele que adicionamos o código. Exclua a classe criada na pasta Filters.

Porém, atenção ao erro:

Error 17 'ActionFilterAttribute' is an ambiguous reference between 'System.Web.Http.Filters.ActionFilterAttribute' and 'System.Web.Mvc.ActionFilterAttribute' C:\Users\graziela\Desktop\Alura\NHibernate\LojaWeb\LojaWeb\Filters\TransactionFilter.cs 16 38 LojaWeb

Pelo que o erro está dizendo acima, parece que você tem dois using para classes de namespaces diferentes, mas com o mesmo nome: ActionFilterAtribute.

Experimente excluir o using System.Web.Http.Filters da sua classe TransactionFilter.

Oi Arthur,

Agradeco mais uma vez.

Fiz a retificacao. a cerca do erro está igual, pois se eu excluir este using aparece ainda mis erros...

Na verdade, assim que criei este filter com o codigo do exercicio e sem retificar absolutamente nada, já apareceu este erro ...

Oi, Graziela.

A minha TransactionFilter ficou assim:

using NHibernate;
using System.Web.Mvc;

namespace LojaWeb.Filters
{
    public class TransactionFilter : ActionFilterAttribute
    {
        private ISession session;
        public TransactionFilter(ISession session)
        {
            this.session = session;
        }
        public override void OnActionExecuting(ActionExecutingContext contexto)
        {
            session.BeginTransaction();
        }
        public override void OnActionExecuted(ActionExecutedContext contexto)
        {
            if (contexto.Exception == null)
            {
                session.Transaction.Commit();
            }
            else
            {
                session.Transaction.Rollback();
            }
            session.Close();
        }

    }
}

E está sem erros. Tente alterar a sua com esse código que eu passei. Veja se os erro nessa classe é resolvido.