Получить метод Caller (имя контроллера и имя действия) в методе перехватчика Castle Windsor

Я хочу найти имя контроллера и действия в методе динамического перехватчика прокси. Я проверяю подход к трассировке стека не очень хорошо, потому что он не последний в стеке, это мой код

глобальная конфигурация замка asax

IWindsorContainer ioc = new WindsorContainer();
ioc.Register(
Component.For<IMyService>().DependsOn()
.ImplementedBy<MyService>()
.Interceptors<MyInterceptor>()
.LifeStyle.PerWebRequest);

ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(ioc));
ioc.Register(
Component.For<IInterceptor>()
.ImplementedBy<MyInterceptor>());

класс контроллера

private IMyService _service;
public HomeController(IMyService service)
{
    _service = service;
}
public ActionResult Index()
{
    _service.HelloWorld();

    return View();
}

класс обслуживания

public class MyService : IMyService
{
    public void HelloWorld()
    {
        throw new Exception("error");
    }
}
public interface IMyService
{
    void HelloWorld();
}

класс перехватчика

//i want to find Controller name  

public class MyInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        //?? controller name ?? method Name  
        invocation.Proceed();
    }
}

person ARA    schedule 07.03.2013    source источник


Ответы (2)


DynamicProxy не предоставляет информацию о вызывающем абоненте.

person Krzysztof Kozmic    schedule 07.03.2013

Я могу получить имя класса и имя метода в моем loggingInterceptor

используя invocation.TargetType.Name

public class LoggingInterceptor : IInterceptor
{ 
    ...

    public void Intercept(IInvocation invocation)
    {
        try
        {
            this.Logger.InfoFormat(
                "{0} | Entering method [{1}] with paramters: {2}",
                invocation.TargetType.Name,
                invocation.Method.Name,
                this.GetInvocationDetails(invocation));

            invocation.Proceed();
        }
        catch (Exception e)
        {
            this.Logger.ErrorFormat(
                "{0} | ...Logging an exception has occurred: {1}", invocation.TargetType.Name, e);
            throw;
        }
        finally
        {
            this.Logger.InfoFormat(
                "{0} | Leaving method [{1}] with return value {2}",
                invocation.TargetType.Name,
                invocation.Method.Name,
                invocation.ReturnValue);
        }
    } 

}
person eiu165    schedule 03.05.2013
comment
спасибо, но я хочу, чтобы имя и метод вызывающего класса не назывались классом и методом! я использую Enterprise Library Instance of Castle и работаю корректно - person ARA; 06.05.2013