/// <summary> /// Registrations the activating. /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="Autofac.Core.ActivatingEventArgs<System.Object>"/> instance containing the event data.</param> private static void RegistrationActivating(object sender, ActivatingEventArgs<object> e) { // Ignore AspectConfiguration and IInterceptor types since they're being referenced via the Autofac // registration context. Otherwise calling e.Context.Resolve<IInterceptor> will fail when // the code below executes. if (e.Instance.GetType() == typeof (MasterProxy) || e.Instance is IInterceptor) { return; } var proxy = (MasterProxy)e.Context.Resolve(typeof(MasterProxy)); if (!e.Instance.IsDecorated(proxy.Configuration)) { return; } var pseudoList = new IInterceptor[proxy.Configuration.Interceptors.Count]; pseudoList[0] = proxy; for (var i = 1; i < pseudoList.Length; i++) { pseudoList[i] = new PseudoInterceptor(); } var interfaceTypes = e.Instance.GetType().GetInterfaces(); var targetInterface = interfaceTypes.FirstMatch(proxy.Configuration.Namespaces); e.Instance = new ProxyGenerator().CreateInterfaceProxyWithTargetInterface(targetInterface, e.Instance, pseudoList); }
public void PostProcess(IServiceRequestResult result) { var instance = result.ActualResult; var instanceTypeName = instance.GetType().FullName; // Ignore any LinFu factories or Snap-specific instances. if (instanceTypeName.Contains("LinFu.") || instanceTypeName == "Snap.AspectConfiguration" || instanceTypeName == "Snap.IMasterProxy" || instanceTypeName == "Snap.MasterProxy") { return; } var proxy = result.Container.GetService<IMasterProxy>(); if (!instance.IsDecorated(proxy.Configuration)) { return; } var pseudoList = new IInterceptor[proxy.Configuration.Interceptors.Count]; pseudoList[0] = proxy; for (var i = 1; i < pseudoList.Length; i++) { pseudoList[i] = new PseudoInterceptor(); } var interfaceTypes = instance.GetType().GetInterfaces(); var targetInterface = interfaceTypes.FirstMatch(proxy.Configuration.Namespaces); result.ActualResult = new ProxyGenerator().CreateInterfaceProxyWithTargetInterface(targetInterface, instance, pseudoList); }
public void PostProcess(IServiceRequestResult result) { var instance = result.ActualResult; // instance cannot be resolved (e.g. not registered in container) if (instance == null) { return; } var instanceTypeName = instance.GetType().FullName; // Ignore any LinFu factories or Snap-specific instances. if (instanceTypeName.Contains("LinFu.") || instanceTypeName == "Snap.AspectConfiguration" || instanceTypeName == "Snap.IMasterProxy" || instanceTypeName == "Snap.MasterProxy") { return; } // inteceptors could not be intercepted too, thus skip the code below if(instance is IInterceptor) { return; } var proxy = result.Container.GetService<IMasterProxy>(); if (!instance.IsDecorated(proxy.Configuration)) { return; } var pseudoList = new IInterceptor[proxy.Configuration.Interceptors.Count]; pseudoList[0] = proxy; for (var i = 1; i < pseudoList.Length; i++) { pseudoList[i] = new PseudoInterceptor(); } var targetInterface = instance.GetType().GetTypeToDynamicProxy(proxy.Configuration.Namespaces); result.ActualResult = AspectUtility.CreateProxy(targetInterface, instance, pseudoList); }
/// <summary> /// Registrations the activating. /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="Autofac.Core.ActivatingEventArgs<System.Object>"/> instance containing the event data.</param> private static void RegistrationActivating(object sender, ActivatingEventArgs<object> e) { // Ignore AspectConfiguration and IInterceptor types since they're being referenced via the Autofac // registration context. Otherwise calling e.Context.Resolve<IInterceptor> will fail when // the code below executes. if(e.Instance is MasterProxy) { // for master proxy we need to assign reference to current container, which is used to resolve aspects from // AutofacServiceLocatorAdapter cannot be built just with e.Context despite fact that e.Context is of IComponentContext // e.Context is valid only in scope of current instance activation // To get valid IComponentContext we need to resolve it in the following way ((MasterProxy) e.Instance).Container = new AutofacServiceLocatorAdapter(e.Context.Resolve<IComponentContext>()); return; } // inteceptors could not be intercepted too, thus skip the code below if (e.Instance is IInterceptor) { return; } var proxy = (MasterProxy)e.Context.Resolve(typeof(MasterProxy)); if (!e.Instance.IsDecorated(proxy.Configuration)) { return; } var pseudoList = new IInterceptor[proxy.Configuration.Interceptors.Count]; pseudoList[0] = proxy; for (var i = 1; i < pseudoList.Length; i++) { pseudoList[i] = new PseudoInterceptor(); } var targetInterface = e.Instance.GetType().GetTypeToDynamicProxy(proxy.Configuration.Namespaces); e.Instance = AspectUtility.CreateProxy(targetInterface, e.Instance, pseudoList); }