Intersepsi yang dikaitkan tingkat metode dengan Autofac

(ini adalah pertanyaan terkait dengan yang ini yang untuk SimpleInjector. Saya dulu disarankan untuk membuat pertanyaan terpisah untuk setiap wadah IoC.)

Dengan Unity, saya dapat dengan cepat menambahkan intersepsi berbasis atribut seperti ini

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..
   }
}

Lalu saya mendaftar ke Unity dengan cara ini:

  container.RegisterType<IPlanRepository, PlanRepository>(new ContainerControlledLifetimeManager(),
           new Interceptor<VirtualMethodInterceptor>(),
           new InterceptionBehavior<PolicyInjectionBehavior>());

Dalam kode repositori saya, saya dapat secara selektif mendekorasi metode tertentu untuk di-cache (dengan nilai atribut yang dapat disesuaikan secara individual untuk setiap metode):

    [MyCache( Minutes = 5, CacheType = CacheType.Memory, Order = 100)]
    public virtual PlanInfo GetPlan(int id)
    {
        // call data store to get this plan;
    }

Saya sedang mencari cara serupa untuk melakukan hal ini di Autofac. Dari apa yang saya baca dan cari sepertinya hanya intersepsi tingkat antarmuka/tipe yang tersedia. Tapi saya ingin pilihan untuk mendekorasi metode individual dengan jenis perilaku intersepsi yang dikontrol atribut ini. Ada saran?


person Calvin    schedule 10.03.2015    source sumber


Jawaban (1)


Anda benar ketika mengatakan tidak ada intersepsi tingkat metode. Namun, ketika Anda menggunakan pencegat tipe tulis, Anda memiliki akses ke metode yang sedang dipanggil. Catatan: ini bergantung pada paket 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();
        }
    }

Pendaftarannya akan menjadi seperti ini.

     containerBuilder.RegisterType<PlanRepository>().As<IPlanRepository>().EnableInterfaceInterceptors();
     containerbuilder.RegisterType<MyCacheAttribute>();
person gaunacode.com    schedule 10.03.2015
comment
Sepertinya Autofac dan SimpleInjector menggunakan proksi Dinamis dan tidak ada dukungan siap pakai untuk intersepsi yang diatribusikan. Steven memberikan solusi khas untuk intersepsi antarmuka di sini: stackoverflow.com/a/28969513/879655 - person Calvin; 11.03.2015
comment
@Calvin: Lebih tepatnya: Simple Injector bahkan tidak mendukung intersepsi. Tidak ada paket atau ekstensi untuk melakukan intersepsi. - person Steven; 12.03.2015