Qual é a melhor implementação para AOP em .Net? [fechadas]

83

Há muita implementação de AOP em C #, VB.net. estas são algumas das implementações AOP:

Qual é a melhor implementação para AOP em .Net? O que devo usar?

ecleel
fonte
4
Seria útil se você fornecesse links para todos os AOP, a fim de economizar um pouco de tempo do leitor com o Google. Espero que esta pergunta / respostas se torne um ótimo resumo das diferentes opções de AOP no .NET
Ian Ringrose,
10
52 pessoas votaram é uma questão construtiva. 5 votou não é construtivo. Quem decidiu? Pelo menos o moderador deve mudar ou reformular a questão, mas é melhor considerar a opinião da maioria das pessoas.
Revious de
2
@Revious Concordo totalmente!
Legends
1
É incrível que o SO e as pessoas votem contra perguntas como esta como OT. Uma pergunta e tecnologia tão úteis para discutir e ajudar a comunidade são simplesmente rejeitadas e fechadas, mas um monte de pessoas antiquadas no estilo dos anos 80 que estão presas ao passado. ASSIM, o mundo mudou. É perfeitamente compreensível que você queira ajudar a responder perguntas específicas, mas pelo menos forneça um link em sua tag "fechada" para postar tais perguntas. Isso ajudaria muito e evitaria esse tipo de estupidez.
pixel

Respostas:

45

Eu acho que Castle Dynamic Proxy é a solução ideal se a interceptação dinâmica puder atender às suas necessidades. Esta estrutura é usada internamente por muitas outras estruturas que desejam oferecer recursos de AOP. Normalmente, a maioria dos contêineres IoC existentes agora fornece alguns mecanismos de interceptação dinâmica (Spring.NET, Castle Windsor, StructureMap, etc.). Se você já trabalha com um contêiner IoC, talvez seja mais fácil ver o que ele propõe.

Se a interceptação dinâmica não pode atender às suas necessidades (entrelaçamento de classes seladas, interceptação de chamadas não virtuais, etc.), então você certamente deseja entrelaçamento estático. PostSharp é a referência neste domínio.

Observe que também existe o Linfu , que pode ser usado para alavancar ambas as modas AOP.

Romain Verdier
fonte
3
+1 nisso se você quiser fazer AOP em tempo de execução. +1 no PostSharp se você quiser o tempo de pós-compilação AOP
Krzysztof Kozmic
Alguma atualização sobre esta resposta? Ou ainda é válido? Eu estava me perguntando especialmente como Spring.Aop se compara a Castle e PostSharp
Evren Kuzucuoglu
1
infelizmente, PostSharp é um produto comercial
pixel
Postsharp é um produto comercial, não gratuito. Por favor, aconselhe qualquer outra coisa para tecelagem estática.
Shivam Sachan de
@ShivamSachan Só porque algo é gratuito não o torna bom. A maioria dos AOP gratuitos no .net morreu com as últimas atualizações de 2 a 5 anos atrás, o PostSharp ainda é o melhor da classe.
Offler,
15

"Melhor" é subjetivo.

Primeiro, faça uma lista dos recursos de que você precisa, sua arquitetura, etc. Em seguida, procure opções que façam o que você precisa, sem introduzir complexidade desnecessária. Por exemplo, vários são orientados à interface: seu código está atualmente orientado à interface? Caso contrário, PostSharp pode ser uma escolha melhor (sendo integrado nas classes originais). Mas é claro, PostSharp não pode ser configurado em tempo de execução ... cavalos para cursos.

Marc Gravell
fonte
você poderia reformular o que disse da seguinte forma: "O melhor é subjetivo, vou fazer uma lista dos prós e contros de alguns desse framework".
Revious de
11

A melhor maneira de fazer programação orientada a aspectos no .NET é usando técnicas de design bem conhecidas. Por exemplo, ao aplicar os princípios SOLID, você pode obter a flexibilidade e modularidade de que precisa para permitir a adição de interesses transversais. Se você tiver o design correto, poderá até mesmo aplicar a maioria das questões transversais sem qualquer estrutura. É uma falácia pensar que OOP não é adequado para fazer AOP.

Aqui estão algumas dicas:

  • Não dependa de instâncias concretas, mas dependa de abstrações.
  • Não misture interesses transversais e lógica de negócios na mesma classe.
  • Adicionar interesses transversais envolvendo classes com lógica de negócios em classes que implementam esses interesses ( decoradores ).
  • Encontre artefatos comuns em seu design e modele-os igualmente, de preferência usando o mesmo tipo de abstrações. Dê uma olhada nisso e nisso, por exemplo.

Quando você tiver as abstrações certas no lugar, adicionar novas preocupações transversais ao sistema é apenas uma questão de escrever uma nova classe de decorador e envolvê-la nas implementações certas. Se as abstrações forem genéricas, você pode envolver um único decorador em torno de um grande grupo de classes (que é exatamente do que trata o AOP).

Embora técnicas como proxies dinâmicos e entrelaçamento de código possam facilitar o trabalho com um aplicativo mal projetado, realmente não há alternativa para um bom design. Mais cedo ou mais tarde você vai se queimar. Isso não significa que a geração dinâmica de proxy e a combinação de código não devam ser usadas. Mas sem um design de aplicativo adequado, mesmo essas técnicas serão apenas marginalmente úteis.

Steven
fonte
AOP é o próximo nível de abstração. Na verdade, é a limitação de herança e composição que leva ao AOP. Você já viu o bloco de exceção Entlib? Aspect é muito mais limpo do que invocar aquele maldito bloco para cada chamada no banco de dados, apenas para tentar-pegar-lançar-log.
Sleeper Smith
2
Se você agrupar todas as chamadas ao seu banco de dados com um bloco de exceção, estará fazendo isso errado de qualquer maneira. Tudo se resume a um bom design. Sempre.
Steven
Então, em vez de capturar exceções de banco de dados, qual é o caminho certo?
OutOFTouch
2
@OutOFTouch: Dê uma olhada na resposta a esta pergunta SO .
Steven
2
@SleeperSmith: embora eu não tenha certeza do que significa "AOP é o próximo nível de abstração", eu realmente acho que você não pode manter grandes sistemas sustentáveis ​​sem o uso de AOP. Eu acredito na aplicação de AOP. No entanto, AOP é um paradigma; não uma ferramenta. Eu concordo com a limitação de herança, mas não é uma limitação de composição que leva ao AOP. É a falta de um design adequado que leva ao uso de entrelaçamento de código e ferramentas de proxy dinâmico. Eu aplico preocupações transversais usando decoradores. Esta é a minha forma preferida de aplicar AOP.
Steven
5

Não sei sobre o melhor, há muitos frameworks e não há horas suficientes no dia para tentar todos eles.

Eu usei o PostSharp e fiquei agradavelmente surpreso como é fácil começar a usá-lo.

Também examinei o AOP com Castle Windsor e Spring.Net, a abordagem é diferente (tempo de execução vs tempo de compilação). Misturar AOP e IoC parece fazer sentido. Quando você ainda não está usando um desses frameworks, é muito mais trabalhoso começar, mas não deixe que isso o impeça.

Para novos projetos agora, provavelmente usaria Castle Windsor, mas principalmente porque também gostaria de usar IoC. Se eu tivesse que implementar rapidamente o AOP em uma base de código existente, usaria PostSharp.

Mendelt
fonte