2015-03-10 6 views
4

(это родственный вопрос 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. Из того, что я читал и искал, выглядит, как только перехват уровня интерфейса/типа доступен. Но мне бы понравился вариант украшения отдельных методов с таким типом контролируемого атрибута поведения перехвата. Есть рекомендации?

ответ

1

Вы правы, когда говорите, что перехват уровня метода отсутствует. Однако при использовании типа перехватчика типа вы имеете доступ к вызываемому методу. Примечание: это зависит от пакета Autofac.Extras.DynamicProxy2.

public sealed class MyCacheAttribute : IInterceptor 
    { 

     public void Intercept(IInvocation invocation) 
     { 
      // grab from cache if I have it, otherwise call the intended method call.. 

      Console.WriteLine("Calling " + invocation.Method.Name); 

      invocation.Proceed(); 
     } 
    } 

Регистрация будет примерно такой.

 containerBuilder.RegisterType<PlanRepository>().As<IPlanRepository>().EnableInterfaceInterceptors(); 
    containerbuilder.RegisterType<MyCacheAttribute>(); 
+0

Похоже, что как Autofac, так и SimpleInjector используют динамический прокси-сервер, и для приписанного перехвата нет готовой поддержки. Стивен представил типичное решение для перехвата интерфейса здесь: http://stackoverflow.com/a/28969513/879655 – Calvin

+0

@Calvin: Если быть более точным: простой инжектор даже не поддерживает перехват. Для перехвата нет пакета или расширений. – Steven