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