Возможно ли перехватить HandlerAttribute, когда я реализую интерфейс, который его использует? - PullRequest
2 голосов
/ 24 января 2012

Давайте сначала покажем сценарий, который работает:

У меня есть HandlerAttribute, который работает с AOP с использованием InterfaceInterceptor, который я регистрирую следующим образом:

public void RegisterType<TInterface, TClass>()
        where TClass : TInterface
{   
    // My UnityContainer         
    this.container.RegisterType<TInterface, TClass>(new ContainerControlledLifetimeManager())
        .Configure<Interception>()
        .SetDefaultInterceptorFor<TInterface>(new InterfaceInterceptor());
}

Интерфейс, который имеетатрибут HandlerAttribute:

public interface IService<TId, TEntity>
    where TId : IEquatable<TId>
    where TEntity: AbstractEntity<TId> // Class that has a Id
{
    [DatabaseTransaction] // The HandlerAttribute
    void Update(TEntity entity);
}

Итак, я создаю MyService, который реализует IService, и регистрируюсь, используя метод RegisterType.Итак, после этого я вызываю метод Resolve из myContainer, передавая IService, и использую службу с моим методом Update, перехваченным моим DatabaseTransactionAttribute:

public class MyService : IService<int, MyEntity>
{
}

После:

RegisterType<IService, MyService>()

Всехорошо, пока я не создам интерфейс IMyService, который реализует IService, и MyService, реализующий IMyService.Я делаю тот же шаг, чтобы зарегистрировать и разрешить интерфейс IMyService, упомянутый выше ...

public class IMyService : IService<int, MyEntity>
{
}

public class MyService : IMyService
{
}

После:

RegisterType<IMyService, MyService>()

проблема заключается в том, когда я вызываю метод Update во второмВ этом случае мой DatabaseTransactionAttribute больше не перехватывает метод, кто-нибудь знает почему?


Я нашел этот вопрос, который каким-то образом связан с: Может ли класс C # наследовать атрибуты от своего интерфейса?

Итак, я должен повторно объявить в интерфейсе, который реализует интерфейс, который имеет атрибут?Оо

Перехватчик работает только если атрибут находится в интерфейсе, который зарегистрирован в контейнере единицы?

1 Ответ

3 голосов
/ 26 января 2012

AFAIK:

Перехватчик работает, только если атрибут находится в интерфейсе, который зарегистрирован в контейнере единицы?

Да

Итак, я должен повторно объявить атрибут в интерфейсе, который реализует, расширяет интерфейс с атрибутом?

Да

...