3 c# aop ninject inversion-of-control
我是Ninject的新手,我试图拦截一个类中的两个方法.第一种方法被截获.第一种方法调用第二种方法,但后者不触发拦截器.
有解决方案吗?
这是一些代码:
public interface IJobMonitor
{
void Run();
JobCheck ManageJob(JobCheck job);
}
[LogAround]
public class JobMonitor : IJobMonitor {
public virtual void Run(){
//boilerplate
var job = ManageJob(new JobCheck());
}
public virtual JobCheck ManageJob(JobCheck job) {
//lots of good stuff
}
}
public class LogAroundAttribute : InterceptAttribute
{
public override IInterceptor CreateInterceptor(IProxyRequest request)
{
return request.Kernel.Get<LogAroundInterceptor>();
}
}
public class LogAroundInterceptor : IInterceptor
{
private readonly ILogger _logger;
public LogAroundInterceptor(ILogger logger)
{
_logger = logger;
}
public void Intercept(IInvocation invocation)
{
var methodName = invocation.Request.Method.Name;
try
{
var message = string.Format("Method {0} called", methodName);
_logger.Info(message);
invocation.Proceed();
var endMessage = String.Format("Method {0} completed", methodName);
_logger.Info(endMessage);
}
catch(Exception e)
{
var message = string.Format("Method {0} EXCEPTION occured: {1} ", methodName, e);
_logger.Fatal(message);
throw;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是代理实现的限制.代理基本上是包装目标的动态类(对象).在运行时,目标的所有用户都在访问代理而不是目标.IInvocation.Proceed最终会将呼叫转发给目标.当目标在自身上调用一个方法时,......直接调用目标方法而不通过代理和拦截器.
你可以做的是调整你的实现,这样你就不需要拦截目标在目标上调用的方法.您可以将该方法提取到另一个可以代理和拦截的类.