Example #1
0
        public static object CreateProxy(Type targetType, IRuntimeInterception[] runtimeInterceptionChain)
        {
            Type   proxyType;
            object proxyInstance;

            object[]      activationArgs;
            IProxyBuilder proxyBuilder;
            IInterceptor  interceptor;

            if ((object)targetType == null)
            {
                throw new ArgumentNullException(nameof(targetType));
            }

            if ((object)runtimeInterceptionChain == null)
            {
                throw new ArgumentNullException(nameof(runtimeInterceptionChain));
            }

            proxyBuilder   = new DefaultProxyBuilder();
            proxyType      = proxyBuilder.CreateInterfaceProxyTypeWithoutTarget(targetType, new Type[] { }, ProxyGenerationOptions.Default);
            interceptor    = new CastleToSolderInterceptor(runtimeInterceptionChain);
            activationArgs = new object[] { new IInterceptor[] { interceptor }, new object() };
            proxyInstance  = Activator.CreateInstance(proxyType, activationArgs);
            return(proxyInstance);
        }
        public IEnumerable <IComponentRegistration> RegistrationsFor(Service service, Func <Service, IEnumerable <IComponentRegistration> > registrationAccessor)
        {
            var serviceWithType = service as IServiceWithType;

            if (serviceWithType == null)
            {
                yield break;
            }

            var serviceType = serviceWithType.ServiceType;

            if (!serviceType.IsInterface || !typeof(IEventHandler).IsAssignableFrom(serviceType) || serviceType == typeof(IEventHandler))
            {
                yield break;
            }

            var interfaceProxyType = _proxyBuilder.CreateInterfaceProxyTypeWithoutTarget(
                serviceType,
                new Type[0],
                ProxyGenerationOptions.Default);


            var rb = RegistrationBuilder
                     .ForDelegate((ctx, parameters) => {
                var interceptors = new IInterceptor[] { new EventsInterceptor(ctx.Resolve <IEventBus>()) };
                var args         = new object[] { interceptors, null };
                return(Activator.CreateInstance(interfaceProxyType, args));
            })
                     .As(service);

            yield return(rb.CreateRegistration());
        }