Apresentando o Equinox Project

O Equinox Project é um projeto open-source desenvolvido em ASP.NET Core que implementa uma série de tecnologias e abordagens muito utilizadas em grandes projetos.

O Equinox Project é a mais recente contribuição que eu entrego a comunidade técnica e espero que seja de grande ajuda para servir de referência nos futuros projetos escritos em ASP.NET Core.

The Equinox Project

O Equinox Project (versão 1.0) é o resultado de quase duas semanas de estudos e desenvolvimento que dediquei ao criar uma aplicação funcional implementando diversas tecnologias e abordagens na nova plataforma ASP.NET Core.

Por ser totalmente desenvolvido com .NET Core esta aplicação pode rodar em ambientes Windows, Linux e OSX (Mac).

Tecnologias/Recursos Implementados

  • ASP.NET Core 1.1 (com .NET Core)
    • ASP.NET MVC Core
    • ASP.NET Identity Core
      • Isolado do MVC e Autenticando via
        Facebook ou Cadastro
  • Entity Framework Core
  • AutoMapper
  • .NET Core Native DI (Isolado do MVC)
  • Unit of Work
  • Repository e Generic Repository
  • FluentValidator

Arquitetura

  • Arquitetura completa com separação de responsabilidades, SOLID e Clean Code
  • DDD – Domain Driven Design (Camadas e Domain Model Pattern)
  • Domain Events
  • Domain Notifications
  • CQRS (Com consistência imediata)
  • Event Sourcing

Versão 1.0

 O Equinox Project na versão 1.0 implementa um cadastro de clientes (CRUD) com regras de negócio e validações de dados.

  • Toda escrita de dados ocorre através de Commands e CommandHandlers que são processados por um Bus em memória (podendo ser adaptado para um Message Queue por exemplo).
  • Após a execução de um Command é disparado um Evento que realiza alguma ação informativa e também é persistido na base (Event Sourcing).
  • A leitura de dados ocorre de forma mais simples dispensando algumas camadas de negócio.
  • Todas as ações são autorizadas pelo mecanismo do ASP.NET Identity que baseia-se em Claims para permitir a leitura e escrita dos dados.
  • As validações de consistência dos dados são realizadas nos Commands e utilizam o FluentValidator como mecanismo.
  • Todos os erros no processamento ou na validação dos dados são disparados através de Domain Events/Notifications e são informados ao usuário de forma personalizada.
  • É possível visualizar a história da entidade através da aplicação que informa desde a criação até a exclusão as mudanças dos dados que ocorreram e o usuário que as executou.

Estes são alguns dos recursos implementados, existem diversos outros em toda extensão da aplicação. Cada um destes recursos eu irei tratar em artigos individuais em uma nova série sobre ASP.NET Core que irei iniciar muito em breve.

Aviso

  • Este projeto não pretende ser uma solução definitiva para todos os cenários.
  • Algumas versões utilizadas (inclusive do ASP.NET Core 1.1) estão em Beta ou Pre-Release.
  • Cuidado ao utilizar este projeto na sua produção. Analise bem os riscos de ser um Early Adopter.
  • Talvez você não irá precisar de muitos dos recursos implementados, procure evitar o OverEngineering

Sobre o futuro

A versão 2.0 do Equinox Project será uma aplicação bem mais extensa com os recursos a seguir:

  • Aplicação completa de aluguel (Booking) utilizando Domain Model Pattern, CQRS e Event Sourcing.
  • ASP.NET Identity trabalhando através de serviços WebAPI com Bearer Token
  • Novo front-end
  • Bancos separados para leitura e gravação de dados
  • Testes de Unidade

Acompanhe os detalhes que serão atualizados no RoadMap do projeto.

Sugestões?

Tem uma boa ideia sobre implementação ou gostaria de ver algo implementado?
Sugestões e críticas serão muito bem vindas!

Por que Equinox?

O Equinócio (Equinox) é um evento astronômico em que o plano do equador da Terra passa pelo centro do Sol. Este evento ocorre duas vezes por ano em torno de 20 de Março e 23 de Setembro. Wikipedia

Equinox é também uma série de publicações (subtítulo: “The Review of Scientific Illuminism”) em forma de livro que serve como o órgão oficial da A∴A∴, uma ordem iniciática fundada por Aleister Crowley Wikipedia

Estamos Online

O projeto está publicado *orgulhosamente* no Microsoft Azure, experimente!

Código Fonte

The Equinox Project – GitHub


Caso esteja interessado em conhecer mais sobre ASP.NET, DDD, Padrões de Arquitetura como CQRS, Event Sourcing e boas práticas de desenvolvimento não deixe de conferir as ementas dos meus cursos:

Vamos continuar a troca de experiências, deixe seu comentário abaixo. Se gostou e concorda com o artigo, compartilhe com seus colegas para transmitirmos o conhecimento para o máximo de pessoas possíveis.

50 ideias sobre “Apresentando o Equinox Project

  1. Parabéns Eduardo, este projeto sem dúvida auxiliará muitos desenvolvedores que procuram se aprofundar no DDD. Uma única dúvida, o Equinox aborda a utilização de Bounded Context?

  2. Legal Eduardo.
    Por que não utilizou MediatR para notification?
    Sobre o asp.net identity com bearer token, por que não implementa um server hibrido com identity server? ou até mesmo separado, já que você já separou o asp.net identity
    O que quis dizer com 2 bancos de dados?

    Ficou show o projeto, espero que de continuidade

    • Olá Rodrigo!

      MediatR irei implementar quando os serviços REST fizerem o papel da camada de Application, por hora não achei necessário.

      É uma boa ideia, deixar o projeto preparado para o Identity Server é uma boa.

      No CQRS nós temos bancos de leitura e de escrita separados, seria esta a ideia.

      Abs!

      • Ia ser lindo ter mediatr para notifications e identityserver 😛
        Ah, um cachemanager também seria bom hehe

        Sobre o CQRS, então, ele deixa 1 banco desnormalizado para leitura? e um banco normalizado para escrita

  3. Inicialmente Parabéns pelo pelo projeto, está incrível! Agora tenho uma dúvida… Com o EF Core não é mais possível criar uma classe com as configurações das entidades?

          • Vou passar aqui como fiz, mas a princípio, tudo .NET Core.

            public class BusinessFunctionConfig
            {
            public BusinessFunctionConfig(EntityTypeBuilder businessFunction)
            {
            businessFunction.HasKey(c => c.Id);
            businessFunction.Property(c => c.Id).ValueGeneratedOnAdd();

            businessFunction.Property(c => c.Name)
            .IsRequired()
            .HasMaxLength(100);

            businessFunction.Property(c => c.Code)
            .IsRequired();
            }
            }

            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
            base.OnModelCreating(modelBuilder);

            new BusinessFunctionConfig(modelBuilder.Entity());
            }

  4. Que código lindo!
    Cara você é o melhor! Eu já vi exemplos conceituais, mas tudo muito incompleto. É nessa hora que separamos os homens dos garotos kkk!

    Parabéns!

  5. Como posso inicializar o:

    InMemoryBus.ContainerAccessor = () => accessor.HttpContext.RequestServices;

    desde um ConsoleApplication, é que estou fazendo alguns testes no projeto e para não criar todo o projeto ASP.Net criei um projeto Console

    Obrigado

  6. Eduardo tenho uma dúvida, você no projeto não esta utilizando o SimpleInjector, porque, tem alguma razão em especial.

    este trecho de código na classe SimpleInjectorBootStrapper como eu posso fazer ele no SimpleInjector?

    services.AddSingleton(Mapper.Configuration);
    services.AddScoped(sp => new Mapper(sp.GetRequiredService(), sp.GetService));

    Cómo devería ser feita a injeção de dependencias do mapper com o SimpleInjector?

    • Preferi o DI nativo para deixar mais “natural” (apesar de ter esquecido a classe com o nome de simpleinjector).

      Dá para fazer com o simpleinjector também, só vai precisar registrar as dependencias do Identity na mão (obrigatoriamente)

      Abs!

  7. Eduardo, eu também tenho uma dúvida, vi que o projeto de Data (os outros não olhei) tu usa o xproj, appsettings.json e project.json, ou seja a estrutura nova do .net core. Mas quando eu crio um novo projeto class library, ele não vem com essa estrutura. Como eu crio um projeto vazio do formato do .net core? Parece bem básico isso mas eu não achei como faz =P. Obrigado

  8. Eduardo,

    Você tem planos de implementar o Angular?

    A interface nova que está no Roadmap seria o Angular Material?

    Você implementou o UoW, mas vi que chamou os contextos diretamente no repositório, é alguma técnica?

    TFA.’.

  9. Olá Eduardo, fiz o download do projeto mais não consigo executar. Aparece a seguinte mensagem da saída:
    O programa “[9868] dotnet.exe” foi fechado com o código -2147450749 (0x80008083).
    O programa “[11952] iisexpress.exe” foi fechado com o código 0 (0x0).

    Podes me ajudar

  10. Parabéns Eduardo! Cara como Sugestão, que tal um artigo sobre Unity of Work?

    Tenho duvidas e tem uma galera que também tem.

    Parabéns

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *