Создайте общий атрибут: MyFilterAttribute, где ctor принимает аргумент Type в качестве аргумента, т.е. что-то вроде этого:
public class MyFilterAttribute : ActionFilterAttribute {
public MyFilterAttribute(Type serviceType) {
this.serviceType = serviceType;
}
public override void OnActionExecuting(FilterExecutingContext c) {
Container.Resolve<IFilterService>(serviceType).OnActionExecuting(c);
// alternatively swap c with some context defined by you
}
// (...) action executed implemented analogously
public Type ServiceType { get { return serviceType; } }
public IWindsorContainer Container { set; get; }
}
Затем используйте тот же подход, что и две статьи, на которые вы ссылаетесь, чтобы взять под контроль то, как вызываются действия, и выполнить ручную инъекцию вашего WindsorContainer в атрибут.
Использование:
[MyFilter (TypeOf (IMyFilterService))]
Тогда ваш действительный фильтр будет в классе, реализующем IMyFilterService, который, в свою очередь, должен реализовать IFilterService, который может выглядеть примерно так:
public interface IFilterService {
void ActionExecuting(ActionExecutingContext c);
void ActionExecuted(ActionExecutedContext c);
}
Таким образом, ваш фильтр даже не будет привязан к ASP.NET MVC, а ваш атрибут - просто часть метаданных - так, как это и должно быть! : -)