Giter Site home page Giter Site logo

thiagolunardi / mvcmusicstoreddd Goto Github PK

View Code? Open in Web Editor NEW
360.0 360.0 168.0 885 KB

The same MVC MusicStore published by Microsoft, but written with all best practices design and architectural patterns as DDD, SelfValidation, SOLID and tests

License: MIT License

C# 86.84% CSS 13.13% ASP 0.03%

mvcmusicstoreddd's Introduction

This sample is outdated, please refer to Equinox Project for the lastest state of the art.

MVC MusicStore Application

The same known MusicStore application, published by Microsoft, but written using tons of design and architectural patterns to force the delivery of a high quality code and provide a responsable development.

Implemented Tools

  • ASP.NET MVC 5.2.3
  • EntityFramework 6.1.2
  • ADO.NET 4.0
  • Dapper 1.38
  • SQL Server Compact 4.0
  • AutoMapper 3.3.1
  • Ninject 3.2.2.0
  • Service Locator 1.3

Patterns Applied

  • DDD - Domain Drive Design
  • SOLID
    1. SRP - Single Responsability Principle
    2. OCP - Open Close Principle
    3. LSP - Liskov Substitution Principle
    4. ISP - Interface Segregation Principle
    5. DIP - Dependency Invertion Principle
  • Self Validation
  • TDD - Teste Driven Design
  • CrossCutting
  • Dependency Injection
  • Invertion of Control
  • Service Locator

This is BETA

"These are currently an early work in progress. It's been pushed here so contributors can create pull requests, etc. Please don't complain unless you are willing to help ;)" - by Vaughn Vernon

Collaborators

Try it

Deploy to Azure

mvcmusicstoreddd's People

Contributors

thiagolunardi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mvcmusicstoreddd's Issues

Dúvida Entidade

Olá Thiago, tudo bem? Gostei muito do modelo do seu projeto e estou estudando para entender melhor o conceito do DDD junto com o livro do Eric Evans.

Me surgiu uma dúvida em relação às Entidades, notei que você coloca na classe uma propriedade IsValid, correto? Porem essa propriedade faz a consistência dos dados como um todo! E se eu quisesse inserir um campo extra (update), como eu validaria somente essa informação?

Ex.: A entidade produto tem os campos nome e preço como obrigatório que teria que ser válidado no IsValid, e se existisse um campo que aceitasse null e eu quisesse inserir essa informação posteriormente, compreende, como eu faria a validação desse campo isoladamente!?

Muito obrigado!

Milton

Erro ao iniciar pelo Visual Studio

@thiagolunardi Ola Thiago,
Tudo bem?
Tentei rodar o projeto pelo Visual Studio e esta dando erro na injeção de dependência, aparece a mensagem:
Nenhum construtor sem parâmetros foi definido para este objeto
Se você tirar os parâmetros do controller e dentro do controller fazer a chamada do ServiceLocator.Current.GetInstance funciona.
Abraços
Rodrigo

Dependencia System.Web no projeto Data

E aí Thiago, tudo bem?

A respeito da dependência System.Web no projeto Data, será que temos outra alternativa para trabalharmos com o Gerenciamento do Contexto? Estou utilizando dessa forma que você fez e funciona perfeitamente, porém não soa muito bem essa DLL.

Muito obrigado! :)

Por que IRepository precisa implementar IDisposable?

Não existe nenhuma implementação de IRepository que não seja IDisposable?

No meu ponto de vista IDisposable é um vazamento de lógica. Você está favorecendo implementações que utilizem banco de dados ou coisas do tipo, assim faria sentido o IDisposable, mas dai eu teria que discordar do nome (seria melhor IDatabaseRepository ou algo do tipo). Não acha melhor apenas marcar as classes com IDisposable e deixar a interface sem essa responsabilidade?

Gostaria de ouvir sua opinião sobre o assunto.

Opinião sobre o self validation

Acredito que esse tipo de "comportamento" não seja necessário, pois no meu ponto de vista, um objeto só pode existir se ele for valido. Logo no lugar de você estar perguntando se aquela instancia é valida, você já sabe que se existir uma instancia o objeto é valido.

Um exemplo:
Considerando uma pessoa, ela não pode ter a data de nascimento dela no futuro.... logo ela é "invalida" e não existe. Podemos transferir esse comportamento para o OO no construtor da class Pessoa caso a data seja invalida, não iremos criar uma instancia.

O que você acha dessa abordagem?

Uso do System.Web na camada de Infra

Thiago, uma dúvida.

No context da aplicação, há uma referencia ao System.Web, na classe ContextManager.

Por que é necessário fazer uma referencia à System.Web nesta camada de aplicação?
Qual a necessidade e qual a função específica deste componente na aplicação.

Isto não força a aplicação a sempre depender de um HttpContext, e por consequencia, rodar somente na Web?

Obrigado pela força.

TDD

Onde foi aplicado TDD ?

ContextManager e HttpContext

Quando Eric Evans fala sobre Arquitetura em camadas, ele deixa claro que um principio essencial é que cada elemento de uma camada dependa somente de outros elementos na mesma camada, ou de uma camada inferior.

Quando você utiliza a Classe HttpContext na sua Classe ContextManager você está violando essa regra. Em outras palavras, sua camada de persistência não deve ter conhecimento algum sobre camadas acima dela. Nem sempre HttpContext estará disponível.

Talvez a Classe ContextManager nem deva existir, se ela não tiver um objetivo maior do que o atual.

Obtendo informações de um serviço externo

Olá Thiago, mais uma outra dúvida que me surgiu em relação ao projeto em questão.

No meu Domínio eu tenho todas as Entities que retorna as informações do banco de dados, correto?

Agora suponhamos que eu plugue um webservice na camada de Infra no qual irei consumir, porem as informações que retorna do webservice vem muita sujeira, ou seja, eu gostaria de ler somente as informações que eu preciso, neste caso, você acha viável criar uma outra pastinha chamada DataTransfer, onde eu criaria todos os Request's e Response's, pensei em criar essa pasta dentro do Dominio pois é obrigatório ter essas informações para eu salvar em uma base de dados local, ou seja, independente do serviço externo que eu utilizar, eu garanto que as informações que eu retornar será compatível com minha base de dados.!

Muito obrigado!

The constant ContextKey in class ContextManager can not be "const"

Hi Thiago,

In the "Context Manager" class, the attribute "Context Key" is setted as constant. However, in the constructor method, its value tries to be changed.

   private const string ContextKey = "ContextManager.Context";

    public ContextManager()
    {
        ContextKey = "ContextKey." + typeof(TContext).Name;
    }

DDD inconsistencies

Hi,
I learn DDD and I don't undestand why:

  1. The project layout is not using domain, but is used "interfaces, services layout":
    Domain/Services/A, Domain/Entities/A vs Domain/A/serviceA.cs, entityA.cs
    I thing Domain/A/serviceA.cs, entityA.cs is cleaner.

  2. Why is domain amnemic (all data access is via services)

  3. Why a data minig methods are in application services and not in domain or domain services.

Notification

Olá Thiago, tudo bem?

Analisando o seu código, verifiquei que você utiliza as validações somente no método IsValid().

Vamos supor que eu queira lançar notificações baseado em alguma condição, posso utilizar o mesmo modelo que você faz para validar uma Entity ou esse modelo é somente para validação?

Muito obrigado

Milton

wrong description

The same MVC MusicStore published by Microsoft, but wrotten with all best practives design and architetural patterns as DDD, SelfValidation, SOLID and tests

change it to => written, practices, architectural

🔨

Porque StoreManagerController chama Dispose nas suas dependências?

O controller StoreManagerController recebe três dependências. Ele não deveria controlar o tempo de vida delas se não me engano. Quando usamos injeção de dependência é função do IOC criar, montar e destruir os objetos. Os objetos que recebem as dependências então não se preocupam em destruir ou liberar nenhum dos recursos porque não sabem se esses recursos são compartilhados com outros objetos.

Por exemplo: se um dos serviços pode ser compartilhado entre controllers? Ao realizar o Dispose os outros controllers que utilizam o mesmo objeto vão passar a dar erro.

Novamente, aguardo sua opinião sobre o assunto.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.