Essa é uma boa estrutura de solução do Visual Studio para um serviço da Web RESTful de design orientado a domínio?

15

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.

Matt W
fonte
"/Biz.Api Fornece os serviços de domínio": você quer dizer Serviços de Aplicativo? Além disso, os repositórios normalmente não retornam DTOs, mas entidades (raízes agregadas). E dependências entre esses projetos seria bom saber também;)
guillaume31
Sim, quero dizer Serviços de Aplicativo. Os repositórios estão retornando instâncias de classes que não fazem nada além de armazenar dados - esses dados são mapeados para a instância usando, nesse caso, o AutoMapper. A instância retornada não possui métodos de manipulação, que eu entendo que as Entidades possuem.
Mt W
"esses dados são mapeados": entre o que e o quê? O que você quer dizer com "manipular métodos"?
precisa saber é o seguinte

Respostas:

22

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 interfacesou servicesna camada de seu domínio; as classes relacionadas devem ser agrupadas por funcionalidade nos módulos.

Songo
fonte
1

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.Dbnão há dependência de Biz.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ão Interfacescomo eu acho que são.

guillaume31
fonte