我使用 Unity 作为 IoC 容器,到目前为止效果很好。现在我想使用带有 TypeMatchingRule 和 LogCallHandler 的拦截来记录对接口 IMyInterface 的所有调用。我正在通过代码配置统一,但无法让日志记录工作。有人可以指点我一个简单的例子吗?我在文档中发现了相当多的小片段,但我无法为我的用例构建工作配置。好像我错过了大局!?
问问题
2415 次
2 回答
4
首先,做一个行为。这是一个例子:
public class MyLoggerBehavior : IInterceptionBehavior
{
public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
var returnValue = getNext()(input, getNext);
if (returnValue.Exception != null)
{
Global.Logger.TraceException("Exception intercepted", returnValue.Exception);
}
else
{
Global.Logger.Trace("Method {0} returned {1}", input.MethodBase, returnValue.ReturnValue);
}
return returnValue;
}
public IEnumerable<Type> GetRequiredInterfaces()
{
return new Type[0];
}
public bool WillExecute
{
get { return Global.Logger.IsTraceEnabled; }
}
}
然后,注册它:
Container
.AddNewExtension<Interception>()
.RegisterType<IDao, NhDao>(new Interceptor(new InterfaceInterceptor()),
new InterceptionBehavior(new MyLoggerBehavior())
);
它将跟踪记录器中的每个调用
于 2011-05-31T09:30:12.810 回答
0
如果要将调用处理程序添加到拦截注册中,则需要执行以下操作(我试图使变量名不言自明):
var intp = m_singleInstance.Configure<Interception>()
.SetInterceptorFor(typeof(typeToIntercept),
new TransparentProxyInterceptor());
var policy = intp.AddPolicy(policyNameString);
policy.AddMatchingRule<TypeMatchingRule>(
new InjectionConstructor(
new InjectionParameter(typeof(typeToIntercept))))
.AddCallHandler(typeof(LogCallHandler),
new ContainerControlledLifetimeManager());
于 2011-06-17T13:12:46.543 回答