Esempio n. 1
0
 /// <summary>
 /// Инициализирует экземпляр <see cref="ReplaceComponentSyntax{TComponent}"/>.
 /// </summary>
 internal ReplaceComponentSyntax(
     IComponentsStore componentsStore,
     PropertyInfo componentProp)
 {
     _componentProp   = componentProp;
     _componentsStore = (MutableComponentsStore)componentsStore;
 }
        /// <inheritdoc />
        public override void BindAspects(IComponentsStore settings)
        {
            var weaver    = AspectWeaverFactory.Create(settings);
            var predicate = settings.AspectWeavePredicate.Get();

            var validDescriptors = _serviceCollection
                                   .Select((d, i) => new { Descriptor = d, Index = i })
                                   .Where(o => predicate.IsWeaveable(o.Descriptor.ServiceType, o.Descriptor.ImplementationType))
                                   .ToArray();

            foreach (var packed in validDescriptors)
            {
                var descriptor = packed.Descriptor;
                if (descriptor.ServiceType.IsGenericTypeDefinition)
                {
                    throw new NotSupportedException(
                              $"Регистрация open-generic не поддерживается (serviceType: '{descriptor.ServiceType.Name}')");
                }

                var replace = ServiceDescriptor.Describe(
                    descriptor.ServiceType,
                    provider => weaver.Weave(
                        GetServiceInstance(provider, descriptor),
                        descriptor.ServiceType,
                        descriptor.ImplementationType),
                    descriptor.Lifetime);

                _serviceCollection.Insert(packed.Index, replace);
                _serviceCollection.Remove(packed.Descriptor);
            }
        }
Esempio n. 3
0
 public Weaved(IComponentsStore components, Container simpleInjectorContainer,
               WindsorContainer windsorContainer, params DependencyPair[] dependency)
 {
     _dependency              = dependency ?? Array.Empty <DependencyPair>();
     _windsorContainer        = windsorContainer;
     _simpleInjectorContainer = simpleInjectorContainer;
     _aspectWeaver            = AspectWeaverFactory.Create(components);
 }
Esempio n. 4
0
        /// <inheritdoc />
        public override void BindAspects(IComponentsStore settings)
        {
            _kernel.Register(Component.For <IComponentsStore>().Instance(settings));

            _kernel.Register(
                Component.For(typeof(WeavedInterceptor <,>))
                .ImplementedBy(typeof(WeavedInterceptor <,>)));

            _kernel.AddFacility(new WindsorAspectFacility(settings));
        }
Esempio n. 5
0
        /// <summary>
        /// Адаптер для обработчика вызовов <see cref="IInterceptor"/>.
        /// </summary>
        /// <param name="components">Компоненты библиотеки.</param>
        public WeavedInterceptor(IComponentsStore components)
        {
            var dataProviderFactory = components.WeaveDataProviderFactory.Get();
            var dataProvider        = dataProviderFactory.Create(typeof(TService), typeof(TImplementation));

            _invocationInterceptor = new InvocationInterceptor(
                dataProvider,
                components.AspectDependencyInjector,
                components.AspectFinalizer);
        }
        [NotNull] public static AspectWeaver Create([NotNull] IComponentsStore componentsStore)
        {
            if (componentsStore == null)
            {
                throw new ArgumentNullException(nameof(componentsStore));
            }

            return(new AspectWeaver(
                       componentsStore.WeaveDataProviderFactory,
                       componentsStore.AspectDependencyInjector,
                       componentsStore.AspectFinalizer));
        }
            public TargetAspectSelectionComponents(IComponentsStore componentsStore)
            {
                DependencyHolder           = componentsStore.DependencyHolder;
                AspectSelector             = componentsStore.AspectSelector;
                AspectWeavePredicate       = componentsStore.AspectWeavePredicate;
                AspectDeclarationCollector = componentsStore.AspectDeclarationCollector;
                PipelineFactory            = componentsStore.PipelineFactory;
                AspectFactory            = componentsStore.AspectFactory;
                AspectDependencyInjector = componentsStore.AspectDependencyInjector;
                AspectOrderStrategy      = componentsStore.AspectOrderStrategy;
                WeaveDataProviderFactory = componentsStore.WeaveDataProviderFactory;
                AspectFinalizer          = componentsStore.AspectFinalizer;

                componentsStore.AspectWeavePredicate
                .Replace(new TargetTypeWeavePredicate(AspectSelector));

                componentsStore.AspectDeclarationCollector
                .Replace(new TargetTypeAspectDeclarationCollector(AspectSelector));
            }
        /// <inheritdoc />
        public override void BindAspects(IComponentsStore components)
        {
            var weaver = AspectWeaverFactory.Create(components);

            object Proxier(object o, Type declaredType, Type targetType) => weaver.Weave(o, declaredType, targetType);

            _container.ExpressionBuilt += (sender, args) =>
            {
                var producer           = _container.GetRegistration(args.RegisteredServiceType);
                var implementationType = producer?.Registration.ImplementationType;

                args.Expression = Expression.Convert(
                    Expression.Invoke(
                        Expression.Constant((Func <object, Type, Type, object>)Proxier),
                        args.Expression,
                        Expression.Constant(args.RegisteredServiceType, typeof(Type)),
                        Expression.Constant(implementationType, typeof(Type))
                        ),
                    args.RegisteredServiceType
                    );
            };
        }
Esempio n. 9
0
 /// <summary>
 /// Выполняет привязку аспектов к зарегистрированным в контейнере компонентам.
 /// </summary>
 /// <param name="settings">Конфигурация.</param>
 public abstract void BindAspects([NotNull] IComponentsStore settings);
Esempio n. 10
0
 public Weaved(IComponentsStore components, params DependencyPair[] dependency)
     : this(components, new Container(), new WindsorContainer(), dependency)
 {
 }
Esempio n. 11
0
 public Weaved(IComponentsStore components, Action <AspectsConfiguration> configurator)
     : this(components, new Container(), new WindsorContainer(), Array.Empty <DependencyPair>())
 {
     _configurator = configurator;
 }
 /// <summary>
 /// Инициализирует экземпляр <see cref="WindsorAspectFacility"/>
 /// </summary>
 /// <param name="components">Компоненты библиотеки.</param>
 public WindsorAspectFacility(IComponentsStore components)
 {
     _components = components;
 }