O que é AOP? Citando a Enciclopédia Baidu: AOP é a abreviação de Programação Orientada a Aspectos, que significa: uma tecnologia para programação orientada à face para alcançar a manutenção unificada das funções do programa por meio de métodos de pré-compilação e agentes dinâmicos durante a execução. Existem duas maneiras principais de implementar o AOP: uma é implantação estática em tempo de compilação, a vantagem é a alta eficiência, a desvantagem é a falta de flexibilidade, e o postsharp em .net é o representante (este é carregado). O outro método são proxies dinâmicos, que têm vantagens e desvantagens opostas aos primeiros, criando proxies dinamicamente para o tipo alvo e interceptando-os por meio de chamadas de proxy. O que o AOP pode fazer, casos de uso comuns são processamento de transações, logs, etc. Vamos falar sobre como o Autofac implementa o AOP, o Autofac é um container IOC muito bom no .net e tem ótimo desempenho (o container mais eficiente no .net), além do AOP ser simplesmente um tigre. O AOP do Autofac é implementado através da parte central do projeto Castle (também um container) chamada Autofac.Extras.DynamicProxy, que, como o nome sugere, é implementado como um proxy dinâmico.
Preparação antes do uso:
Instale o pacote Nuget Autofac, Autofac.Extras.DynamicProxy, e três referências serão adicionadas após a instalação bem-sucedida
Agora está oficialmente iniciado!
Passo 1: Criar um interceptador
Abaixo está um exemplo de um interceptor simples que exibe o nome do método interceptado, uma lista de parâmetros e o resultado de retorno
Passo 2: Registrar o interceptor no contêiner Autofac
O interceptor deve estar registrado no contêiner Aufofac, seja pelo tipo de interceptor ou pelo nome, o que torna o método de uso do interceptor diferente (conforme discutido adiante).
Injeção de nomes construtor. Register(c => novo CallLogger(Console.Out)). <IInterceptor>Nomeados ("log-calls");
Injeção tipo construtor. Register(c => novo CallLogger(Console.Out));
Passo 3: Ativar o interceptador
Existem duas maneiras principais de habilitar o interceptor: EnableInterfaceInterceptors(), EnableClassInterceptors().
O método EnableInterfaceInterceptors cria dinamicamente um proxy de interface
O método EnableClassInterceptors criará uma subclasse proxy da classe alvo, e deve ser notado aqui que ele apenas interceptará o método virtual e sobrescreverá o método
Ative código de exemplo do Interceptor:
Passo 4: Indique o tipo que você deseja interceptar
Existem duas maneiras:
O primeiro tipo: Adicionar um atributo de característica ao tipo
O segundo tipo é injetar dinamicamente o interceptor quando o tipo de registro é transferido para o contêiner
Passo 5: Teste o efeito
1. Interceptação por procuração
Código de classe circular:
2. Interceptação de proxy de interface
Código de Interface IShape:
Código de classe circular:
|