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

Erro na injeção de dependências - 'System.TypeInitializationException'

Ocorre o seguinte erro no método RegisterServices da classe NinjectWebCommon, quando acesso o link de cadastro de produtos:

An exception of type 'System.TypeInitializationException' occurred in LojaWeb.dll but was not handled in user code

Additional information: O inicializador de tipo de 'LojaWeb.Infra.NHibernateHelper' acionou uma exceção.

Classe NinjectWebCommon:

[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;
    using NHibernate;
    using LojaWeb.Infra;

    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<ISession>().ToMethod(
                                    x => NHibernateHelper.AbreSession()).InRequestScope();
        }        
    }
}

Classe NHibernateHelper:

using NHibernate;
using NHibernate.Cfg;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;

namespace LojaWeb.Infra
{
    public class NHibernateHelper
    {
        private static ISessionFactory factory = RecuperaConfiguracao().BuildSessionFactory();

        public static Configuration RecuperaConfiguracao()
        {    
            Configuration cfg = new Configuration();
            cfg.Configure();
            cfg.AddAssembly(Assembly.GetExecutingAssembly());
            return cfg;
        }

        public static ISession AbreSession()
        {
            return factory.OpenSession();
        }
    }
}
3 respostas

Você mudou alguma coisa no arquivo de configuração? Consegue acessar alguma página além do cadastro de produto?

Essas duas linhas:

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

São necessárias? Eu não as vi no curso.

solução!

Olá Arthur, obrigado pela resposta.

Consegui encontrar o problema, estava na configuração do hibernate.cfg, meu usuário estava incorreto, mas não havia percebido. Recentemente mudei o usuário e havia me esquecido.

Sem problemas. Marque sua resposta mesmo como solução para o seu caso :)

Sempre que você tiver esse erro daí na hora de pedir uma sessão, é certo que o problema está no arquivo de configuração com alguma coisa faltando ou errada.