(это вопрос, связанный с этим для SimpleInjector. Я был рекомендуется создавать отдельные вопросы для каждого контейнера IoC.)
С Unity я могу быстро добавить перехват на основе атрибутов, подобный этому
public sealed class MyCacheAttribute : HandlerAttribute, ICallHandler
{
public override ICallHandler CreateHandler(IUnityContainer container)
{
return this;
}
public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{
// grab from cache if I have it, otherwise call the intended method call..
}
}
Затем я регистрируюсь в Unity следующим образом:
container.RegisterType<IPlanRepository, PlanRepository>(new ContainerControlledLifetimeManager(),
new Interceptor<VirtualMethodInterceptor>(),
new InterceptionBehavior<PolicyInjectionBehavior>());
В моем коде репозитория я могу выборочно украшать определенные методы для кэширования (со значениями атрибутов, которые можно настроить индивидуально для каждого метода):
[MyCache( Minutes = 5, CacheType = CacheType.Memory, Order = 100)]
public virtual PlanInfo GetPlan(int id)
{
// call data store to get this plan;
}
Я изучаю аналогичные способы сделать это в Autofac. Из того, что я читал и искал, похоже, что доступен только перехват на уровне интерфейса/типа. Но мне бы очень хотелось украсить отдельные методы таким типом поведения перехвата, контролируемого атрибутами. Любой совет?