接着Depandency Injection继续。最想做的还是用现成的程序模块对程序进行行为注入。不过不急,在此之前自己写一个接口对象观察一下IInterceptionBehavior接口的功效。
记录日志是最常见的行为注入。这里最重要的是实现IIntercptionBehavior接口中的Invoke方法,这个方法有两个参数,第一个是被拦截的接口,第二个则是一个委托行为列表(以委托的形式给出)。这里我们在列表循环前记录参数,在循环后记录返回值。
let result = getNext.Invoke().Invoke(input, getNext)
这句代码完成具体的工作。拦截的行为是依次进行的,彼此之际并无联系,也不应有联系。每个拦截都仅关注本身的具体行为,这是最好的情况,不过实际中也并不能保证这一点。对拦截的顺序还是要多加注意。比如缓冲的例子,有可能截断注入行为列表。每个行为对后续的动作不可控,所以当缓冲需要做一些特殊操作直接返回值时,会忽略后续的动作。又比如权限管理。
下面进行注册,管理容器需要支持Interception
注册
最后是结果
如果我们反复调用RegisterType多次,记录的条目也会相应增多。应该可以想象结构上的变化。
以上。
type LogingInterceptionBehavior() =
let WriteLog message =
printfn "From the logging interceptor: %A" message
interface IInterceptionBehavior with
member x.Invoke((input:IMethodInvocation), (getNext:GetNextInterceptionBehaviorDelegate)) =
String.Format("Invoke method {0}:{2} at {1}", input.MethodBase, DateTime.Now.ToLongTimeString(), input.Target) |> WriteLog
let result = getNext.Invoke().Invoke(input, getNext)
match result.Exception with
| null ->
String.Format("Method {0}:{3} returned {1} at {2}", input.MethodBase, result.ReturnValue, DateTime.Now.ToLongTimeString(), input.target) |> WriteLog
| _ ->
String.Format("Method {0} threw exception {1} at {2}", input.MethodBase, result.Exception.Message, DateTime.Now.ToLongTimeString()) |> WriteLog
result
member x.GetRequiredInterfaces() =
Type.EmptyTypes |> Seq.ofArray
member x.WillExecute with get() = true记录日志是最常见的行为注入。这里最重要的是实现IIntercptionBehavior接口中的Invoke方法,这个方法有两个参数,第一个是被拦截的接口,第二个则是一个委托行为列表(以委托的形式给出)。这里我们在列表循环前记录参数,在循环后记录返回值。
let result = getNext.Invoke().Invoke(input, getNext)
这句代码完成具体的工作。拦截的行为是依次进行的,彼此之际并无联系,也不应有联系。每个拦截都仅关注本身的具体行为,这是最好的情况,不过实际中也并不能保证这一点。对拦截的顺序还是要多加注意。比如缓冲的例子,有可能截断注入行为列表。每个行为对后续的动作不可控,所以当缓冲需要做一些特殊操作直接返回值时,会忽略后续的动作。又比如权限管理。
下面进行注册,管理容器需要支持Interception
container.AddNewExtension<Interception>() |> ignore注册
container.RegisterType<ITenantStore, TenantStore>(new Interceptor<TransparentProxyInterceptor>(),
new InterceptionBehavior<LogingInterceptionBehavior>())
let t = container.Resolve<ITenantStore>();
t.Msg()可以看到当解析接口时就会跳出很多记录,猜想应该在构造对象时做了不少的动作,父类的接口调用也会被记录。最后是结果
From the logging interceptor: "Invoke method Void Msg():FSI_0002+TenantStore at 11:59:00"
Hello, it's TenantStore
From the logging interceptor: "Method Void Msg() returned at 11:59:00"如果我们反复调用RegisterType多次,记录的条目也会相应增多。应该可以想象结构上的变化。
以上。
本文介绍如何利用F#(f#)和Enterprise Library Unity进行依赖注入,并着重探讨了IInterceptionBehavior接口在行为注入中的作用。通过创建LoggingInterceptionBehavior类实现接口,记录方法调用的日志。在Unity容器中注册拦截行为,确保在实例化和调用接口方法时触发日志记录。文章强调了拦截行为顺序的重要性,以及在实际应用中可能遇到的特殊情况,如缓冲和权限管理。
650

被折叠的 条评论
为什么被折叠?



