Давайте сначала покажем сценарий, который работает:
У меня есть 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 # наследовать атрибуты от своего интерфейса?
Итак, я должен повторно объявить в интерфейсе, который реализует интерфейс, который имеет атрибут?Оо
Перехватчик работает только если атрибут находится в интерфейсе, который зарегистрирован в контейнере единицы?