castle 动态代理(同步)
Castle DynamicProxy是用于在运行时生成代理对象的类库。下图是castle.core官方描叙拦截器的执行图。

实现步骤
1.要拦截的接口,类型定义
2.拦截器的定义,实现IInterceptor接口
3.创建动态代理,调用
简单示例
public interface ISimpleInterface { int Do(); } public class SimpleClass : ISimpleInterface { public int Do() { Console.WriteLine("this is five"); return 5; } }
2.
public class LogInvocationInterceptor : IInterceptor { private StringBuilder sb = new StringBuilder(); private List<string> invocations = new List<string>(); public bool Proceed = true; public void Intercept(IInvocation invocation) { PreProceed(invocation); PerformProceed(invocation); PostProceed(invocation); } protected virtual void PerformProceed(IInvocation invocation) { if (Proceed) { invocation.Proceed(); } else if (invocation.Method.ReturnType.IsValueType && invocation.Method.ReturnType != typeof(void)) { invocation.ReturnValue = Activator.CreateInstance(invocation.Method.ReturnType); // set default return value } } protected virtual void PreProceed(IInvocation invocation) { invocations.Add(invocation.Method.Name); sb.Append(string.Format("{0} ", invocation.Method.Name)); } protected virtual void PostProceed(IInvocation invocation) { } public string LogContents { get { return sb.ToString(); } } public IList Invocations { get { return invocations; } } }
3.
var result = new ProxyGenerator().CreateInterfaceProxyWithTarget<ISimpleInterface>(new SimpleClass(), new LogInvocationInterceptor()); var returnValue = result.Do();
动态代理与autofac 的结合使用
nuget 安装 autofac 与Autofac.Extras.DynamicProxy
var builder = new ContainerBuilder(); builder.RegisterType<SimpleClass>() .As<ISimpleInterface>() .EnableInterfaceInterceptors().InterceptedBy(typeof(LogInvocationInterceptor)); builder.RegisterType<LogInvocationInterceptor>().SingleInstance(); var container = builder.Build(); var foo = container.Resolve<ISimpleInterface>(); foo.Do();

浙公网安备 33010602011771号