Pergunta

Tenho lido sobre DDD e acho que posso estar usando os serviços de forma errada ou pelo menos de uma forma não tão ideal.Minhas classes de serviço tendem a ter algumas variáveis ​​de instância contendo referências de repositório e parecem fazer muito trabalho (ou seja, têm muitos métodos).

É aconselhável criar serviços mais focados?Como um método por serviço que executa alguma lógica específica?Além disso, as classes de serviço deveriam armazenar variáveis ​​de instância para outras entidades?Eu li algo sobre serviços sem estado, não tenho certeza se estou quebrando essa regra por ter essas variáveis ​​de instância.

Obrigado!

Foi útil?

Solução

Minhas aulas de serviço tendem a ter algumas variáveis ​​de instância ...

Isso não é necessariamente um cheiro de código.Se o seu serviço requer muitas dependências para concluir seu trabalho, isso é simplesmente um fato.

... Eles parecem fazer muito trabalho (ou seja, têm muitos métodos).

É aconselhável criar serviços mais focados?

Como regra geral, quanto mais granular você puder tornar suas interfaces de serviço (ou seja,quanto menos métodos), melhor (já teve que vasculhar uma interface com cinquenta métodos procurando aquele que você deseja chamar?).Mas, a menos que você esteja lançando uma API pública, a granularidade de suas interfaces de serviço pode ser refinada à medida que avança.Muitas vezes, ao iniciar um projeto, começo com apenas um serviço e o divido ao longo do tempo.Se você é o consumidor desses serviços, quando começar a sentir a dor de uma interface ficar muito grande, saberá que é hora de desmembrá-la.Claro, se isso é uma API pública, então você terá que fazer um design muito mais inicial.

Além disso, as classes de serviço deveriam armazenar variáveis ​​de instância para outras entidades?Eu li algo sobre serviços sem estado, não tenho certeza se estou quebrando essa regra por ter essas variáveis ​​de instância.

Armazenar dependências como variáveis ​​de instância não implica necessariamente que seu serviço não seja sem estado, desde que as variáveis ​​de instância também sejam sem estado.Para serem consideradas sem estado, as chamadas de método em um serviço não devem de forma alguma depender de métodos anteriores terem sido chamados.Você deve ser capaz de carregar uma única instância de serviço e compartilhá-la para seu aplicativo (ou seja,uma instância de um serviço sem estado não deve ser específica para uma sessão específica de usuário).Em outras palavras, seu serviço não deve manter nenhum estado entre chamadas de método.Armazenar uma dependência de repositório sem estado como uma variável em uma instância de serviço não viola esse requisito.

A razão pela qual os serviços sem estado são uma meta desejável é que não ter estado reduz muito a possibilidade de bugs.Ele simplifica o teste de um método de serviço, restringindo os casos de teste à variação dos parâmetros passados, em vez de ter que se preocupar com o estado anterior do serviço.Também pode oferecer benefícios de desempenho.

Outras dicas

Eu recomendaria ler sobre injeção de dependência, inversão de controle e coisas do gênero.

Aqui está o artigo de Fowler: http://martinfowler.com/articles/injection.html, embora eu sempre o tenha achado um pouco exagerado.Eu tentaria percorrer um tutorial que representa o uso de um contêiner DI/IoC.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top