标签:fsharp f# enterprise library interceptor
这篇就三种拦截模式进行一下探索。类型 | 特点 | 其他 | |
InterfaceInterceptor | Innstance | 仅单接口 | 类内部函数互相引用也能无法引起拦截行为 |
TransparentProxyInterceptor | Instance | 多接口(接口之间可以切换) MarshalByRef 运行缓慢 接口类型(virtual, non-virtual, or interface) | 类内部函数互相引用也能无法引起拦截行为 |
VirtualMethodInterceptor | Type | 多接口 不能用在已有对象上,接口函数必须为virtual | 类内部函数互相引用也能引起拦截行为 |
type ITenantStore = abstract member Msg : unit->unit type TenantStore() as x= //do printfn "new TenantStore %A" (x.GetHashCode()) interface ITenantStore with member this.Msg() = printfn "Hello, it's TenantStore" interface IDisposable with member this.Dispose() = printfn "TenantStore hase been cleaned"
let showregistrations (container:UnityContainer) = container.Registrations |> Seq.iter (fun i -> printfn "Regist Type:%A" i.RegisteredType) using(new UnityContainer())(fun ctner-> ctner.AddNewExtension<Interception>() |> ignore ctner.RegisterType<ITenantStore, TenantStore>(new Interceptor<TransparentProxyInterceptor>(),//后续对此注入策略进行切换 new InterceptionBehavior<LogingInterceptionBehavior>()) |> ignore showregistrations ctner let t = ctner.Resolve<ITenantStore>() t.Msg())
Regist Type:Microsoft.Practices.Unity.IUnityContainer Regist Type:Microsoft.Practices.Unity.InterceptionExtension.InjectionPolicy Regist Type:FSI_0002+ITenantStore From the logging interceptor: "Invoke method System.Type GetType():System.Object at 16:20:45" From the logging interceptor: "Method System.Type GetType():System.Object returned FSI_0002+TenantStore at 16:20:45" From the logging interceptor: "Invoke method Void Msg():FSI_0002+ITenantStore at 16:20:45" Hello, it's TenantStore From the logging interceptor: "Method Void Msg():FSI_0002+ITenantStore returned at 16:20:45" val it : unit = ()
Regist Type:Microsoft.Practices.Unity.IUnityContainer Regist Type:Microsoft.Practices.Unity.InterceptionExtension.InjectionPolicy Regist Type:FSI_0002+ITenantStore From the logging interceptor: "Invoke method Void Msg():FSI_0002+ITenantStore at 16:22:54" Hello, it's TenantStore From the logging interceptor: "Method Void Msg():FSI_0002+ITenantStore returned at 16:22:54" val it : unit = ()虽然对象有两个接口,IDiposable接口和ITenantStore接口,拦截仍然成功了,所以支持多对象指的是接口之间的切换,并非不支持实现多对象的类。
Regist Type:Microsoft.Practices.Unity.IUnityContainer Regist Type:Microsoft.Practices.Unity.InterceptionExtension.InjectionPolicy Regist Type:FSI_0002+ITenantStore Hello, it's TenantStore val it : unit = ()
type testClass() = abstract member Test : unit -> unit default x.Test() = printfn "hello " using(new UnityContainer())(fun ctner-> ctner.AddNewExtension<Interception>() |> ignore ctner.RegisterType<testClass>(new Interceptor<VirtualMethodInterceptor>(), new InterceptionBehavior<LogingInterceptionBehavior>()) |> ignore showregistrations ctner let t = ctner.Resolve<testClass>() t.Test() )
Regist Type:Microsoft.Practices.Unity.IUnityContainer Regist Type:Microsoft.Practices.Unity.InterceptionExtension.InjectionPolicy Regist Type:FSI_0002+testClass From the logging interceptor: "Invoke method Void Test():FSI_0002+testClass at 9:30:27" hello From the logging interceptor: "Method Void Test():FSI_0002+testClass returned at 9:30:27" val it : unit = ()拦截成功。
type TenantStore() as x= //do printfn "new TenantStore %A" (x.GetHashCode()) abstract Msg : unit -> unit default x.Msg() = printfn "Hello, it's TenantStore" abstract Dispose : unit -> unit default x.Dispose() = printfn "TenantStore hase been cleaned" interface ITenantStore with member x.Msg() = x.Msg() interface IDisposable with member x.Dispose() = x.Dispose()有些繁琐,接口实现的代码可以复用,不幸中的万幸。下面的例子中我同时测试一下多接口之间转换的情况,看看VirtualMethodInterceptor是否也支持多接口,文档上没有明确表明。
using(new UnityContainer())(fun ctner-> ctner.AddNewExtension<Interception>() |> ignore ctner.RegisterType<ITenantStore, TenantStore>(new Interceptor<VirtualMethodInterceptor>(), new InterceptionBehavior<LogingInterceptionBehavior>()) |> ignore ctner.RegisterType<testClass>(new Interceptor<VirtualMethodInterceptor>(), new InterceptionBehavior<LogingInterceptionBehavior>()) |> ignore showregistrations ctner let t = ctner.Resolve<ITenantStore>() t.Msg() let o = (box t) :?> IDisposable o.Dispose() )
Regist Type:Microsoft.Practices.Unity.IUnityContainer Regist Type:Microsoft.Practices.Unity.InterceptionExtension.InjectionPolicy Regist Type:FSI_0002+ITenantStore From the logging interceptor: "Invoke method System.Type GetType():System.Object at 9:38:47" From the logging interceptor: "Method System.Type GetType():System.Object returned FSI_0010+TenantStore at 9:38:47" From the logging interceptor: "Invoke method Void Msg():FSI_0002+ITenantStore at 9:38:47" Hello, it's TenantStore From the logging interceptor: "Method Void Msg():FSI_0002+ITenantStore returned at 9:38:47" From the logging interceptor: "Invoke method System.Type GetType():System.Object at 9:38:47" From the logging interceptor: "Method System.Type GetType():System.Object returned FSI_0010+TenantStore at 9:38:47" From the logging interceptor: "Invoke method Void Dispose():System.IDisposable at 9:38:47" TenantStore hase been cleaned From the logging interceptor: "Method Void Dispose():System.IDisposable returned at 9:38:47" val it : unit = ()
Regist Type:Microsoft.Practices.Unity.IUnityContainer Regist Type:Microsoft.Practices.Unity.InterceptionExtension.InjectionPolicy Regist Type:FSI_0002+ITenantStore From the logging interceptor: "Invoke method Void Msg():FSI_0002+ITenantStore at 9:39:44" Hello, it's TenantStore From the logging interceptor: "Method Void Msg():FSI_0002+ITenantStore returned at 9:39:44" System.InvalidCastException: 无法将类型为“DynamicModule.ns.Wrapped_ITenantStore_67632c824c8e42bbad5925d203ac819b”的对象强制转换为类型“System.IDisposable”。 在 FSI_0015.it@149-7.Invoke(UnityContainer ctner) 位置 E:\WorkHell\fsharp-practise\EnterpriseLibraryUnity\Program.fs:行号 157 在 Microsoft.FSharp.Core.Operators.Using[T,TResult](T resource, FSharpFunc`2 action) 在 <StartupCode$FSI_0015>.$FSI_0015.main@() 已因出错而停止
Regist Type:Microsoft.Practices.Unity.IUnityContainer Regist Type:Microsoft.Practices.Unity.InterceptionExtension.InjectionPolicy Regist Type:FSI_0002+ITenantStore Regist Type:FSI_0002+testClass From the logging interceptor: "Invoke method Void Msg():FSI_0017+TenantStore at 9:42:01" Hello, it's TenantStore From the logging interceptor: "Method Void Msg():FSI_0017+TenantStore returned at 9:42:01" From the logging interceptor: "Invoke method Void Dispose():FSI_0017+TenantStore at 9:42:01" TenantStore hase been cleaned From the logging interceptor: "Method Void Dispose():FSI_0017+TenantStore returned at 9:42:01" val it : unit = ()
(box t) :?> TenantStore结果
通过fsharp 使用Enterprise Library Unity 3 - 三种拦截模式的探索
标签:fsharp f# enterprise library interceptor
原文地址:http://blog.csdn.net/samwell/article/details/40615535