Os detalhes são os seguintes: estou desenvolvendo um sistema para o domínio de transporte público urbano. Nesse domínio, existem passageiros, que podem estar associados a várias categorias ("idoso", "estudante", etc).
Um dos requisitos é que o sistema deve informar, para um dado passageiro, quais são as categorias que lhe são permitidas. Por exemplo, um passageiro associado à categoria "estudante" poderia ser associado também à categoria "trabalhador", mas não à categoria "idoso".
Agora imagine que possam existir outras regras para esse conjunto de categorias (um número máximo, por exemplo), de modo que eu possa simplesmente modificar um arquivo de configuração para trocar essa regra. Esse também é um dos requisitos. Já que o Grails oferece aquele resources.groovy, seria a opção perfeita.
A melhor solução que encontrei para esse problema de variabilidade das regras do domínio foi usar o padrão
Specification. Dessa maneira, eu tenho uma classe Passageiro, com um método 'categoriasPermitidas()', que retorna uma lista. Para inferir essas categorias, ele usa uma especificação. Mas a classe Passageiro conhece apenas a interface da especificação, e não a sua implementação.
Para cada regra diferente de combinação de categorias, eu teria uma implementação diferente. A idéia é configurar na DSL do Spring qual implementação eu quero usar e essa implementação seria injetada nos objetos da classe Passageiro.
Mas tanto Passageiro, quanto as especificações são classes do domínio, que implementam regras de negócio. Por isso, a pergunta: como eu injeto uma especificação dentro de um Passageiro, sem usar factory, nem service locator, usando apenas DI?
Valeu!