TUTORIAL: ASP.NET MVC COM NHIBERNATE E MYSQL – PARTE 2 – Criando o Repository

Na primeira parte do tutorial, nós mapeamos o nosso modelo utilizando o Mapping By Code do NHibernate. Como nosso modelo é basicamente um usuário com endereço, caso você queira popular o seu banco com os países, cidades e estados disponíveis, eu criei este gist no github.
Bem, vamos começar agora com o acesso aos dados. Vamos criar um Repository para o nosso usuário contendo as operações básicas: Salvar, Atualizar, Obter 1 usuário e Obter uma lista de usuários:

    public class UserRepository
    {
        public User Get(Guid id)
        {
            using (ISession session = NHibernateHelper.OpenSession())
            {
                var user = session.Get<User>(id);
                NHibernateUtil.Initialize(user.Adress);
                NHibernateUtil.Initialize(user.Adress.City);
                NHibernateUtil.Initialize(user.Adress.State);
                NHibernateUtil.Initialize(user.Adress.Country);
                return user;
            }
        }

        public void Save(User user)
        {
            using (ISession session = NHibernateHelper.OpenSession())
            using (ITransaction transaction = session.BeginTransaction())
            {
                    session.Save(user);
                    transaction.Commit();
            }
        }

        public void Update(User user)
        {
            using (ISession session = NHibernateHelper.OpenSession())
            using (ITransaction transaction = session.BeginTransaction())
            {
                session.Update(user);
                transaction.Commit();
            }
        }

        public IList<User> GetAll()
        {
            using (ISession session = NHibernateHelper.OpenSession())
            {
                var users = session.CreateCriteria<User>().List<User>();
                foreach (var user in users)
                {
                    NHibernateUtil.Initialize(user.Adress);
                    NHibernateUtil.Initialize(user.Adress.City);
                    NHibernateUtil.Initialize(user.Adress.State);
                    NHibernateUtil.Initialize(user.Adress.Country);
                }
                return users;
            }
        }

        public void Delete(User user)
        {
            using (ISession session = NHibernateHelper.OpenSession())
            using (ITransaction transaction = session.BeginTransaction())
            {
                session.CreateQuery("delete from User u where u.Id = (:id)")
                    .SetParameter("id", user.Id)
                    .ExecuteUpdate();
                transaction.Commit();
            }
        }
    }

E vamos criar também um Repository para o endereço, já que teremos que buscar listas de cidades, estados, etc. ficaria feio chamarmos o repositório de usuário para isso:

    public class AdressRepository
    {
        public IList<Country> GetAllCountries()
        {
            using (ISession session = NHibernateHelper.OpenSession())
                return session.CreateCriteria<Country>().List<Country>();
        }


        public IList<State> GetAllStatesFrom(Country country)
        {
            using (ISession session = NHibernateHelper.OpenSession())
                return session.CreateCriteria<State>()
                    .CreateAlias("Country", "c")
                    .Add(Restrictions.Eq("c.Iso", country.Iso)).List<State>();
        }


        public IList<City> GetAllCitiesFrom(State city)
        {
            using (ISession session = NHibernateHelper.OpenSession())
                return session.CreateCriteria<City>()
                    .CreateAlias("State", "s")
                    .Add(Restrictions.Eq("s.Id", city.Id)).List<City>();
        }
    }

O que estamos fazendo aqui? Criamos um Repository para acessar os dados. Eu acho mais elegante e fácil de trabalhar com a Session se nós utilizarmos One Session Per Request (Uma sessão a cada requisição). Criando a sessão no começo da requisição e injetando a sessão através de algum ioc container (você pode ver um exemplo com o Unity aqui). Mas eu achei que ficaria mais simples de começar desse jeito neste tutorial.

Na próxima parte, veremos como fica simples criar as Views.
Abraço 😉

Links

Parte 1 – PARTE 1- Mapeando com Mapping By Code
Parte 2 – PARTE 2 – Criando o Repository

Anúncios

5 comentários sobre “TUTORIAL: ASP.NET MVC COM NHIBERNATE E MYSQL – PARTE 2 – Criando o Repository

  1. Olá Rafael, achei legal mesmo rapaz; este Artigo do MVC com HIBERNATE ; pois eu estava acostumado com EntityFramework-5 e 6. Porém depois que fiz um pequeno teste com NHibernate; achei muito legal. Eu queria ver se você poderia me enviar o Artigo ( ou pedaço de orientação ); sobre MOVIMENTAR os DADOS usando as Views; eu queria ver como você tramitaria com o uso das classes de Repositório e NHibernateHelper ( que é onde estaria o DAO ) ? Ou seja a partir da Controller ( do UsuarioController ); por exemplo, como faria p/ Gravar, Excluir … ?

    Agradeço antecipadamente; e que o grande Deus ilumine vosso Caminho.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s