/// <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); } }
public Weaved(IComponentsStore components, Container simpleInjectorContainer, WindsorContainer windsorContainer, params DependencyPair[] dependency) { _dependency = dependency ?? Array.Empty <DependencyPair>(); _windsorContainer = windsorContainer; _simpleInjectorContainer = simpleInjectorContainer; _aspectWeaver = AspectWeaverFactory.Create(components); }
/// <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)); }
/// <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 ); }; }
/// <summary> /// Выполняет привязку аспектов к зарегистрированным в контейнере компонентам. /// </summary> /// <param name="settings">Конфигурация.</param> public abstract void BindAspects([NotNull] IComponentsStore settings);
public Weaved(IComponentsStore components, params DependencyPair[] dependency) : this(components, new Container(), new WindsorContainer(), dependency) { }
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; }