Autofac和DynamicProxy2搭配实现Aop动手训练

Aop含义:aspect-oriented programming 

  • 实现工具介绍  

  Autofac是一个比较流行的Ioc组件,DynamicProxy2是 the Castle Project core的一部分,提供了一个拦截框架

  • 组件安装和实现步骤

1.先打开vs新建一个web项目,打开nuget执行安装命令如下图所示

2.配置autofac

在Global.asax文件中在添加如下代码

1
2
3
4
5
6
7
public class Global : HttpApplication, IContainerProviderAccessor
{
  static IContainerProvider _containerProvider;
  // Instance property that will be used by Autofac HttpModules   // to resolve and inject dependencies. 
  public IContainerProvider ContainerProvider { get { return _containerProvider; } }
 
}

  

在Application_Start方法中配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Application_Start(object sender, EventArgs e)
       {
           // 在应用程序启动时运行的代码
           RouteConfig.RegisterRoutes(RouteTable.Routes);
           BundleConfig.RegisterBundles(BundleTable.Bundles);
 
           // Build up your application container and register your dependencies.     
           var builder = new ContainerBuilder();
           // Once you're done registering things, set the container     // provider up with your registrations.   
           builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly());
           builder.RegisterType<Calculator>().EnableClassInterceptors().InterceptedBy(typeof(CallLogger)).As<ICalculator>();         
           builder.RegisterType<CallLogger>();
           var container = builder.Build();
           _containerProvider = new ContainerProvider(container);
 
       }

3.aop示例代码如下包含一个接口,一个实现类和一个拦截类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public interface ICalculator
    {
        int Add(int lhs, int rhs);
        int Multiply(int lhs, int rhs);
    }
 
    [Intercept(typeof(CallLogger))]
    public class Calculator : ICalculator
    {
        public virtual int Add(int lhs, int rhs)
        {
            return lhs + rhs;
        }
 
        public virtual int Multiply(int lhs, int rhs)
        {
            return lhs * rhs;
        }
    }
 
 
    public class CallLogger : IInterceptor
    {
        TextWriter _output = HttpContext.Current.Response.Output;
 
        //public CallLogger(TextWriter output)
        //{
        //    _output = output;
        //}
 
        public void Intercept(IInvocation invocation)
        {
            _output.Write("Calling method {0} with parameters {1}... ",
                invocation.Method.Name,
                string.Join(", ", invocation.Arguments.Select(a => (a ?? "").ToString()).ToArray()));
 
            invocation.Proceed();
 
            _output.WriteLine("Done: result was {0}.", invocation.ReturnValue);
        }
    }

  global文件中的代码已经写完,其引用应该包括如下几个

using Autofac;
using Autofac.Extras.DynamicProxy2;
using Autofac.Integration.Web;
using Castle.Core;
using Castle.DynamicProxy;

4.效果展现,在Page页添加如下代码,然后运行浏览。

复制代码
 public partial class _Default : Page
    {
        //public ICalculator handler { get; set; }
        protected void Page_Load(object sender, EventArgs e)
        {
            var cpa = (IContainerProviderAccessor)HttpContext.Current.ApplicationInstance;
            var cp = cpa.ContainerProvider;
            var handler = cp.RequestLifetime.Resolve<ICalculator>();
            var test = handler.Add(1, 33);
            Response.Write(test.ToString());
        }
    }
复制代码

训练结束,

参考文档http://docs.autofac.org/en/v3.5.2/advanced/interceptors.html#enabling-interception

 

posted @   作古人  阅读(3439)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示