Не удается получить пользовательские атрибуты в перехватчике с помощью DynamicProxy - PullRequest
1 голос
/ 04 июня 2011

В настоящее время я использую Interceptors, используя Castle DynamicProxy. Я требую, чтобы перехватчик взял некоторые пользовательские атрибуты в моем методе уровня обслуживания, но invocation.Method.GetCustomAttributes ничего не возвращает. Что-нибудь, что я мог сделать неправильно?

Перехваченный метод:

 [Transaction()]
 [SecurityRole(AuthenticationRequired = false, Role = SystemRole.Unauthorised)]
 public virtual void LoginUser(out SystemUser userToLogin, string username)
 {
     ...
 }

Перехватчик:

// Checks that a security attribute has been defined
foreach (SecurityRoleAttribute role in invocation.Method.GetCustomAttributes(typeof(SecurityRoleAttribute), true))
{
    if (!securityAttributeDefined)
        securityAttributeDefined = true;
}

Я также пробовал:

Attribute.GetCustomAttribute(invocation.Method, typeof(SecurityRoleAttribute), true);

Обновление:

Может быть проблема с конфигурацией. Код конфигурации выглядит следующим образом:

InterceptorsInstaller:

    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
         container.Register(
            Component.For<LoggingInterceptor>()
            .Named("LoggingInterceptor"));

         container.Register(
            Component.For<SecurityInterceptor>()
            .Named("SecurityInterceptor"));

         container.Register(
            Component.For<ValidationInterceptor>()
            .Named("ValidationInterceptor"));
    }

ServiceInstaller:

    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        string[] interceptors = {"LoggingInterceptor", "SecurityInterceptor"};

        container.Register(AllTypes.FromAssemblyContaining<BaseService>().Pick()
                            .If(Component.IsInSameNamespaceAs<LoginService>())
                            .Configure(c => c
                                               .LifeStyle.Transient
                                               .Interceptors(interceptors))
                            .WithService.DefaultInterface());
    }

Я использую Castle 2.5.2 / .Net 3.5.

Спасибо

Пол

Ответы [ 2 ]

5 голосов
/ 08 июня 2011

Оказывается, это потому, что прокси - это интерфейсный прокси. Получение цели вызова метода, затем получение атрибутов из methodInfo исправили это:

    MethodInfo methodInfo = invocation.MethodInvocationTarget; 
    if (methodInfo == null) { 
        methodInfo = invocation.Method; 
    }
1 голос
/ 04 июня 2011

Ваш код перехватчика в порядке, но вы неправильно его регистрируете.То, что вы написали, означает «если я попрошу у вас IInterceptor, дайте мне SecurityInterceptor».Вы хотите сказать «перехватывать вызовы в классе, который содержит LoginUser() (назовем его Foo), используя SecurityInterceptor».В переводе на C # это выглядит так:

container.Register(Component.For<Foo>().Interceptors<SecurityInterceptor>());
container.Register(Component.For<SecurityInterceptor>().Named("SecurityInterceptor"));
...