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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM