zoukankan      html  css  js  c++  java
  • Autofac和DynamicProxy2搭配实现Aop动手训练

    Aop含义:aspect-oriented programming 

    • 实现工具介绍  

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

    • 组件安装和实现步骤

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

    2.配置autofac

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

    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方法中配置

     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示例代码如下包含一个接口,一个实现类和一个拦截类

    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

  • 相关阅读:
    NDK开发,如何配置 debug环境
    NDK 开发中,各种指令集的坑,arm64
    levmar ndk 编译
    kubernetes 存储
    kubernetes 存储
    Docker 仓库
    docker 容器
    查看系统日志
    linux 进程命令小结
    DaemonSet
  • 原文地址:https://www.cnblogs.com/zhengwl/p/5433181.html
Copyright © 2011-2022 走看看