(это родственный вопрос this one, который для SimpleInjector. Я рекомендовал создать отдельные вопросы для каждого контейнера IoC.)Метод уровня приписано перехват с Autofac
С 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. Из того, что я читал и искал, выглядит, как только перехват уровня интерфейса/типа доступен. Но мне бы понравился вариант украшения отдельных методов с таким типом контролируемого атрибута поведения перехвата. Есть рекомендации?
Похоже, что как Autofac, так и SimpleInjector используют динамический прокси-сервер, и для приписанного перехвата нет готовой поддержки. Стивен представил типичное решение для перехвата интерфейса здесь: http://stackoverflow.com/a/28969513/879655 – Calvin
@Calvin: Если быть более точным: простой инжектор даже не поддерживает перехват. Для перехвата нет пакета или расширений. – Steven