Estou criando uma solução RESTful da API da Web .NET 4.5 C # e gostaria que alguém me dissesse se minha solução de projeto está correta e / ou sábia (suficiente) para uma solução projetada usando o Domain Driven Design, por favor.
A solução foi dividida em 6 projetos:
- /Base
(Não mencionado por nada)
O projeto da Web e forma a interface entre a solução e o mundo externo. Contém os controladores da API da Web. Contém quase nenhuma lógica além de coletar valores de objetos de solicitação e solicitar trabalho à camada BizApi.
- /Biz.Api
(Referenciado pela Base])
Fornece os serviços de domínio e permite que o projeto de interface / Base tenha acesso aos objetos de lógica de negócios do domínio no projeto /Biz.Domain.
- /Biz.Domain
(Referenciado por Biz.Api)
Fornece as classes de domínio para a camada Biz.Api. Eles fornecem métodos para manipular os dados dos negócios na memória.
- /Dal.Db
(Referenciado por Biz.Api)
A camada de repositório de banco de dados. Acessa os bancos de dados e mapeia os dados retornados para os DTOs internos definidos na camada / Interfaces.
- /Dal.Services
(Referenciado por Biz.Api)
Fornece uma camada de proxy para dependências externas, como serviços da Web, e mapeia seus dados retornados para DTOs internos definidos no projeto / Interfaces.
- / Interfaces
(Referenciado pela maioria dos projetos acima)
Contém as classes DTO para transmitir dados pela solução e as interfaces C # para definir contratos para coisas como IoC.
fonte
Respostas:
Essa estrutura de pastas é inspirada no famoso livro de design de domínio implementado de Vaugh Vernon.
Solução:
├ WebService (REST Services residem aqui)
├ WebServiceTests
├ Aplicação (Serviços de aplicativos residem aqui)
├ ApplicationTests
├ Domínio (Entidades, VO, Serviços de Domínio, fábricas de domínio, especificações, eventos de domínio, interfaces Repositórios, infra-estruturas de serviços interfaces)
├ DomainTests
├ Infraestrutura (Repositórios, Serviços de infraestrutura impl., Adaptadores para serviços externos)
└ InfraestruturaTestes
Começo com uma solução e, em seguida, crio quatro projetos para cada camada no meu aplicativo, depois outros quatro projetos para cada camada.
Não crie uma pasta
interfaces
ouservices
na camada de seu domínio; as classes relacionadas devem ser agrupadas por funcionalidade nos módulos.fonte
Quanto à estrutura, parece-me bom, embora eu tivesse inventado nomes diferentes e mais auto-descritivos, como em
"YourProjectWebApi"
vez de"Base"
, em"Dal.External"
vez de"Dal.Services"
e assim por diante.Porém, pode haver um cheiro na parte "DTO interno", pois você deve retirar entidades dos repositórios e poder executar ações de domínio (negócios) diretamente sobre elas. Entidades não são apenas DTOs.
Eu meio que percebo que
Dal.Db
não há dependência deBiz.Domain,
que a camada Domínio esteja fazendo algum mapeamento entre os DTOs do projeto Interfaces (retornados pelos Repositórios?) E seus próprios objetos Domínio. Isso não seria correto em uma arquitetura típica DDD de última geração (== "onion" ou "hexagonal") - a camada Domain não deve fazer referência a outros projetos. Pela mesma razão, as interfaces de repositório devem ser declaradas no domínio e nãoInterfaces
como eu acho que são.fonte