public async Task <HttpResponseMessage> ResolveByQueue(ResolveRequest request)
        {
            if (string.IsNullOrWhiteSpace(request.queueaddress))
            {
                return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "QueueAddress"));
            }

            DateTime from, to;

            try
            {
                from = DateTime.Parse(request.from, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
                to   = DateTime.Parse(request.to, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
            }
            catch (Exception)
            {
                return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "From/To"));
            }

            await messageSession.SendLocal <MarkPendingRetriesAsResolved>(m =>
            {
                m.QueueAddress = request.queueaddress;
                m.PeriodFrom   = from;
                m.PeriodTo     = to;
            }).ConfigureAwait(false);

            return(Request.CreateResponse(HttpStatusCode.Accepted));
        }
Example #2
0
        internal static object TryDecorateRegistration(
            Service service,
            IComponentRegistration registration,
            object instance,
            IComponentContext context,
            IEnumerable <Parameter> parameters)
        {
            if (service is DecoratorService ||
                !(service is IServiceWithType serviceWithType) ||
                registration is ExternalComponentRegistration)
            {
                return(instance);
            }

            var decoratorRegistrations = context.ComponentRegistry.DecoratorsFor(serviceWithType);

            if (decoratorRegistrations.Count == 0)
            {
                return(instance);
            }

            var serviceType       = serviceWithType.ServiceType;
            var resolveParameters = parameters as Parameter[] ?? parameters.ToArray();

            var instanceType     = instance.GetType();
            var decoratorContext = DecoratorContext.Create(instanceType, serviceType, instance);
            var decoratorCount   = decoratorRegistrations.Count;

            for (var index = 0; index < decoratorCount; index++)
            {
                var decoratorRegistration = decoratorRegistrations[index];
                var decoratorService      = decoratorRegistration.Services.OfType <DecoratorService>().First();
                if (!decoratorService.Condition(decoratorContext))
                {
                    continue;
                }

                var serviceParameter = new TypedParameter(serviceType, instance);
                var contextParameter = new TypedParameter(typeof(IDecoratorContext), decoratorContext);

                var invokeParameters = new Parameter[resolveParameters.Length + 2];
                for (var i = 0; i < resolveParameters.Length; i++)
                {
                    invokeParameters[i] = resolveParameters[i];
                }

                invokeParameters[invokeParameters.Length - 2] = serviceParameter;
                invokeParameters[invokeParameters.Length - 1] = contextParameter;

                var resolveRequest = new ResolveRequest(decoratorService, decoratorRegistration, invokeParameters);
                instance = context.ResolveComponent(resolveRequest);

                if (index < decoratorCount - 1)
                {
                    decoratorContext = decoratorContext.UpdateContext(instance);
                }
            }

            return(instance);
        }
Example #3
0
        public async Task <IActionResult> MineBlock([FromQuery] int proof, [FromQuery] ulong nodeId)
        {
            if (!_chain.MineBlock(proof, nodeId))
            {
                return(Ok(false));
            }
            System.IO.File.WriteAllText(_options.ChainFilePath, JsonConvert.SerializeObject(_chain));

            var last2 = _chain.Blocks.TakeLast(2).ToArray();

            var resolveRequest = new ResolveRequest
            {
                LastBlockHash  = last2[0].LastBlockHash,
                LastBlockIndex = last2[0].Index,
                NewBlock       = last2[1]
            };

            var httpClient = new HttpClient();
            var body       = new StringContent(JsonConvert.SerializeObject(resolveRequest), Encoding.UTF8, "application/json");

            foreach (var node in _nodes)
            {
                await httpClient.PostAsync(new Uri(node.Url).AbsoluteUri + "api/resolve", body).ConfigureAwait(false);
            }
            return(Ok(true));
        }
Example #4
0
        public object Execute(ResolveRequest request)
        {
            object result;

            try
            {
                result = ResolveComponent(request);
            }
            catch (ObjectDisposedException)
            {
                throw;
            }
            catch (DependencyResolutionException dependencyResolutionException)
            {
                End(dependencyResolutionException);
                throw;
            }
            catch (Exception exception)
            {
                End(exception);
                throw new DependencyResolutionException(ResolveOperationResources.ExceptionDuringResolve, exception);
            }

            End();
            return(result);
        }
Example #5
0
        public InstanceLookup(
            IResolveOperation context,
            ISharingLifetimeScope mostNestedVisibleScope,
            ResolveRequest request)
        {
            _context = context;
            _service = request.Service;
            ComponentRegistration = request.Registration;
            Parameters            = request.Parameters;

            try
            {
                _activationScope = ComponentRegistration.Lifetime.FindScope(mostNestedVisibleScope);
            }
            catch (DependencyResolutionException ex)
            {
                var services = new StringBuilder();
                foreach (var s in ComponentRegistration.Services)
                {
                    services.Append("- ");
                    services.AppendLine(s.Description);
                }

                var message = string.Format(CultureInfo.CurrentCulture, ComponentActivationResources.UnableToLocateLifetimeScope, ComponentRegistration.Activator.LimitType, services);
                throw new DependencyResolutionException(message, ex);
            }
        }
Example #6
0
        static IComponentRegistration CreateMetaRegistration <T>(Service providedService, ServiceRegistration serviceRegistration) where T : class
        {
            var rb = RegistrationBuilder.ForDelegate(
                (c, p) =>
            {
                var accessor = c.Resolve <ILifetimeScopeAccessor>();
                return(new Work <T>(w =>
                {
                    var scope = accessor.LifetimeScope;
                    if (scope == null)
                    {
                        return default;
                    }

                    var workValues = scope.Resolve <WorkValues <T> >();

                    if (!workValues.Values.TryGetValue(w, out T value))
                    {
                        var request = new ResolveRequest(providedService, serviceRegistration, p);
                        value = (T)workValues.ComponentContext.ResolveComponent(request);
                        workValues.Values[w] = value;
                    }

                    return value;
                }));
            })
                     .As(providedService)
                     .Targeting(serviceRegistration.Registration)
                     .SingleInstance();

            return(rb.CreateRegistration());
        }
Example #7
0
        /// <summary>
        /// Invoke this method to execute the operation for a given request.
        /// </summary>
        /// <param name="request">The resolve request.</param>
        /// <returns>The resolved instance.</returns>
        private object ExecuteOperation(ResolveRequest request)
        {
            object result;

            try
            {
                InitiatingRequest = request;
                if (DiagnosticSource.IsEnabled())
                {
                    DiagnosticSource.OperationStart(this, request);
                }

                result = GetOrCreateInstance(CurrentScope, request);
            }
            catch (ObjectDisposedException disposeException)
            {
                if (DiagnosticSource.IsEnabled())
                {
                    DiagnosticSource.OperationFailure(this, disposeException);
                }

                throw;
            }
            catch (DependencyResolutionException dependencyResolutionException)
            {
                if (DiagnosticSource.IsEnabled())
                {
                    DiagnosticSource.OperationFailure(this, dependencyResolutionException);
                }

                End(dependencyResolutionException);
                throw;
            }
            catch (Exception exception)
            {
                End(exception);
                if (DiagnosticSource.IsEnabled())
                {
                    DiagnosticSource.OperationFailure(this, exception);
                }

                throw new DependencyResolutionException(ResolveOperationResources.ExceptionDuringResolve, exception);
            }
            finally
            {
                ResetSuccessfulRequests();
            }

            End();

            if (DiagnosticSource.IsEnabled())
            {
                DiagnosticSource.OperationSuccess(this, result);
            }

            return(result);
        }
Example #8
0
        public void OperationRaisesFailureTraceEvents()
        {
            var builder = new ContainerBuilder();

            builder.Register <string>(ctxt => throw new InvalidOperationException());

            var container  = builder.Build();
            var mockTracer = Mocks.GetTracer();

            container.SubscribeToDiagnostics(mockTracer);

            var scope = container.Resolve <ILifetimeScope>() as ISharingLifetimeScope;

            var resolveOp = new ResolveOperation(scope, container.DiagnosticSource);

            var raisedEvents = new List <string>();

            var request = new ResolveRequest(new TypedService(typeof(string)), scope.ResolvableImplementationFor <string>(), Enumerable.Empty <Parameter>());

            mockTracer.OperationStarting += (op, req) =>
            {
                raisedEvents.Add("opstart");
                Assert.Equal(resolveOp, op);
                Assert.Equal(request, req);
            };

            mockTracer.RequestStarting += (op, ctxt) =>
            {
                raisedEvents.Add("reqstart");
                Assert.Equal(resolveOp, op);
                Assert.Equal(request.Service, ctxt.Service);
            };

            mockTracer.RequestFailing += (op, ctxt, ex) =>
            {
                raisedEvents.Add("reqfail");
                Assert.Equal(resolveOp, op);
                Assert.IsType <DependencyResolutionException>(ex);
            };

            mockTracer.OperationFailing += (op, ex) =>
            {
                raisedEvents.Add("opfail");
                Assert.IsType <DependencyResolutionException>(ex);
            };

            try
            {
                resolveOp.Execute(request);
            }
            catch
            {
            }

            Assert.Equal(new[] { "opstart", "reqstart", "reqfail", "opfail" }, raisedEvents);
        }
Example #9
0
        private T ResolveComponentAttributeService(TKey key)
        {
            if (_registrations.Value.ContainsKey(key))
            {
                var resolveRequest = new ResolveRequest(new UniqueService(), _registrations.Value[key], Enumerable.Empty <Parameter>());

                return((T)_componentContext.ResolveComponent(resolveRequest));
            }
            throw new KeyNotFoundException($"No component registered with key '{key}'");
        }
Example #10
0
        private void InvokePipeline(ResolveRequest request, DefaultResolveRequestContext requestContext)
        {
            request.ResolvePipeline.Invoke(requestContext);
            if (requestContext.Instance == null)
            {
                throw new DependencyResolutionException(ResolveOperationResources.PipelineCompletedWithNoInstance);
            }

            _successfulRequests.Add(requestContext);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="DefaultResolveRequestContext" /> class.
 /// </summary>
 /// <param name="owningOperation">The owning resolve operation.</param>
 /// <param name="request">The initiating resolve request.</param>
 /// <param name="scope">The lifetime scope.</param>
 /// <param name="diagnosticSource">
 /// The <see cref="System.Diagnostics.DiagnosticListener" /> to which trace events should be written.
 /// </param>
 internal DefaultResolveRequestContext(
     IResolveOperation owningOperation,
     ResolveRequest request,
     ISharingLifetimeScope scope,
     DiagnosticListener diagnosticSource)
 {
     Operation        = owningOperation;
     ActivationScope  = scope;
     Parameters       = request.Parameters;
     _resolveRequest  = request ?? throw new ArgumentNullException(nameof(request));
     PhaseReached     = PipelinePhase.ResolveRequestStart;
     DiagnosticSource = diagnosticSource;
 }
Example #12
0
        /// <summary>
        /// Resolves an unregistered service.
        /// </summary>
        /// <param name="context">The <see cref="IComponentContext"/>.</param>
        /// <param name="serviceType">Service type.</param>
        /// <param name="parameters"><see cref="IEnumerable{T}"/> of <see cref="Parameter"/>.</param>
        /// <returns>Resolved component.</returns>
        public static object ResolveUnregistered(this IComponentContext context, Type serviceType, IEnumerable <Parameter> parameters)
        {
            var scope = context.Resolve <ILifetimeScope>();

            using (var innerScope = scope.BeginLifetimeScope(b => b.RegisterType(serviceType)))
            {
                var typedService = new TypedService(serviceType);
                innerScope.ComponentRegistry.TryGetRegistration(typedService, out IComponentRegistration reg);

                var request = new ResolveRequest(typedService, reg, parameters);
                return(context.ResolveComponent(request));
            }
        }
Example #13
0
        public void OperationRaisesSuccessTraceEvents()
        {
            var builder = new ContainerBuilder();

            builder.RegisterInstance("Hello");

            var container  = builder.Build();
            var mockTracer = Mocks.GetTracer();

            container.SubscribeToDiagnostics(mockTracer);

            var scope = container.Resolve <ILifetimeScope>() as ISharingLifetimeScope;

            var resolveOp = new ResolveOperation(scope, container.DiagnosticSource);

            var raisedEvents = new List <string>();

            var request = new ResolveRequest(new TypedService(typeof(string)), scope.ResolvableImplementationFor <string>(), Enumerable.Empty <Parameter>());

            mockTracer.OperationStarting += (op, req) =>
            {
                raisedEvents.Add("opstart");
                Assert.Equal(resolveOp, op);
                Assert.Equal(request, req);
            };

            mockTracer.RequestStarting += (op, ctxt) =>
            {
                raisedEvents.Add("reqstart");
                Assert.Equal(resolveOp, op);
                Assert.Equal(request.Service, ctxt.Service);
            };

            mockTracer.RequestSucceeding += (op, ctxt) =>
            {
                raisedEvents.Add("reqsuccess");
                Assert.Equal(resolveOp, op);
            };

            mockTracer.OperationSucceeding += (op, instance) =>
            {
                raisedEvents.Add("opsuccess");
                Assert.Equal("Hello", instance);
            };

            resolveOp.Execute(request);

            Assert.Equal(new[] { "opstart", "reqstart", "reqsuccess", "opsuccess" }, raisedEvents);
        }
        /// <inheritdoc/>
        protected override object ResolveInstance <T>(IComponentContext ctx, ResolveRequest request)
        {
            var lifetime = ctx.Resolve <ILifetimeScope>().BeginLifetimeScope(request.Service);

            try
            {
                var value = (T)lifetime.ResolveComponent(request);
                return(new Owned <T>(value, lifetime));
            }
            catch
            {
                lifetime.Dispose();
                throw;
            }
        }
Example #15
0
        public ActionResult Resolve([FromBody] ResolveRequest resolveRequest)
        {
            securityManager.Verify(new SecurityAssertion()
            {
                Payload = resolveRequest
            });

            logger.Info("Resolve: " + CustomJsonSerializer.Serialize(resolveRequest));

            ResolveResponse resolveResponse = new ResolveResponse();

            resolveResponse.Endpoints = storageManager.Resolve(resolveRequest);

            return(new JsonResult(resolveResponse));
        }
Example #16
0
        private IComponentRegistration CreateLazyRegistration <T>(Service providedService, Service valueService, IComponentRegistration valueRegistration)
        {
            var rb = RegistrationBuilder.ForDelegate(
                (c, p) =>
            {
                var context = c.Resolve <IComponentContext>();
                var request = new ResolveRequest(valueService, valueRegistration, p);
                return(new Lazy <T>(() => (T)context.ResolveComponent(request)));
            })
                     .As(providedService)
                     .Targeting(valueRegistration, IsAdapterForIndividualComponents)
                     .InheritRegistrationOrderFrom(valueRegistration);

            return(rb.CreateRegistration());
        }
Example #17
0
        /// <inheritdoc />
        public object ResolveComponent(ResolveRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            CheckNotDisposed();

            var operation = new ResolveOperation(this);
            var handler   = ResolveOperationBeginning;

            handler?.Invoke(this, new ResolveOperationBeginningEventArgs(operation));
            return(operation.Execute(request));
        }
Example #18
0
        /// <summary>
        /// Executes the startable and auto-activate components in a context.
        /// </summary>
        /// <param name="properties">The set of properties used during component registration.</param>
        /// <param name="componentContext">
        /// The <see cref="IComponentContext"/> in which startable services should execute.
        /// </param>
        internal static void StartStartableComponents(IDictionary <string, object?> properties, IComponentContext componentContext)
        {
            var componentRegistry = componentContext.ComponentRegistry;

            try
            {
                properties[MetadataKeys.StartOnActivatePropertyKey] = true;

                // We track which registrations have already been auto-activated by adding
                // a metadata value. If the value is present, we won't re-activate. This helps
                // in the container update situation.
                var startableService = new TypedService(typeof(IStartable));
                foreach (var registration in componentRegistry.RegistrationsFor(startableService).Where(r => !r.Metadata.ContainsKey(MetadataKeys.AutoActivated)))
                {
                    try
                    {
                        var request = new ResolveRequest(startableService, registration, Enumerable.Empty <Parameter>());
                        componentContext.ResolveComponent(request);
                    }
                    finally
                    {
                        registration.Metadata[MetadataKeys.AutoActivated] = true;
                    }
                }

                var autoActivateService = new AutoActivateService();
                foreach (var registration in componentRegistry.RegistrationsFor(autoActivateService).Where(r => !r.Metadata.ContainsKey(MetadataKeys.AutoActivated)))
                {
                    try
                    {
                        var request = new ResolveRequest(autoActivateService, registration, Enumerable.Empty <Parameter>());
                        componentContext.ResolveComponent(request);
                    }
                    catch (DependencyResolutionException ex)
                    {
                        throw new DependencyResolutionException(string.Format(CultureInfo.CurrentCulture, ContainerBuilderResources.ErrorAutoActivating, registration), ex);
                    }
                    finally
                    {
                        registration.Metadata[MetadataKeys.AutoActivated] = true;
                    }
                }
            }
            finally
            {
                properties.Remove(MetadataKeys.StartOnActivatePropertyKey);
            }
        }
        /// <summary>
        /// Retrieve registrations for an unregistered service, to be used
        /// by the container.
        /// </summary>
        /// <param name="service">The service that was requested.</param>
        /// <param name="registrationAccessor">A function that will return existing registrations for a service.</param>
        /// <returns>Registrations providing the service.</returns>
        public IEnumerable <IComponentRegistration> RegistrationsFor(Service service, Func <Service, IEnumerable <IComponentRegistration> > registrationAccessor)
        {
            if (service == null)
            {
                throw new ArgumentNullException(nameof(service));
            }
            if (registrationAccessor == null)
            {
                throw new ArgumentNullException(nameof(registrationAccessor));
            }

            var ts = service as IServiceWithType;

            if (ts == null || !ts.ServiceType.IsGenericTypeDefinedBy(typeof(Owned <>)))
            {
                return(Enumerable.Empty <IComponentRegistration>());
            }

            var ownedInstanceType    = ts.ServiceType.GetTypeInfo().GenericTypeArguments.First();
            var ownedInstanceService = ts.ChangeType(ownedInstanceType);

            return(registrationAccessor(ownedInstanceService)
                   .Select(r =>
            {
                var rb = RegistrationBuilder.ForDelegate(ts.ServiceType, (c, p) =>
                {
                    var lifetime = c.Resolve <ILifetimeScope>().BeginLifetimeScope(ownedInstanceService);
                    try
                    {
                        var context = new ResolveRequest(ownedInstanceService, r, p);
                        var value = lifetime.ResolveComponent(context);
                        return Activator.CreateInstance(ts.ServiceType, new[] { value, lifetime });
                    }
                    catch
                    {
                        lifetime.Dispose();
                        throw;
                    }
                })
                         .ExternallyOwned()
                         .As(service)
                         .Targeting(r, IsAdapterForIndividualComponents)
                         .InheritRegistrationOrderFrom(r);

                return rb.CreateRegistration();
            }));
        }
        CacheInSession <TLimit, TActivatorData, TSingleRegistrationStyle>(
            this IRegistrationBuilder <TLimit, TActivatorData, TSingleRegistrationStyle> registration)
            where TActivatorData : IConcreteActivatorData
            where TSingleRegistrationStyle : SingleRegistrationStyle
        {
            if (registration == null)
            {
                throw new ArgumentNullException(nameof(registration));
            }

            var services = registration.RegistrationData.Services.ToArray();

            registration.RegistrationData.ClearServices();

            return(registration
                   .ExternallyOwned()
                   .OnRegistered(e =>
            {
                foreach (var service in services)
                {
                    e.ComponentRegistryBuilder.Register(RegistrationBuilder
                                                        .ForDelegate((c, p) =>
                    {
                        var session = HttpContext.Current.Session;
                        object result;
                        lock (session.SyncRoot)
                        {
                            result = session[e.ComponentRegistration.Id.ToString()];
                            if (result == null)
                            {
                                var resolveRequest = new ResolveRequest(service, e.ComponentRegistration, p);
                                result = c.ResolveComponent(resolveRequest);
                                session[e.ComponentRegistration.Id.ToString()] = result;
                            }
                        }

                        return result;
                    })
                                                        .As(service)
                                                        .InstancePerLifetimeScope()
                                                        .ExternallyOwned()
                                                        .CreateRegistration());
                }
            }));
        }
        private IComponentRegistration CreateRegistration <T>(Service providedService, Service valueService, ServiceRegistration serviceRegistration)
            where T : notnull
        {
            var registrationDelegate = RegistrationBuilder.ForDelegate(
                (c, p) =>
            {
                var request = new ResolveRequest(valueService, serviceRegistration, p);

                return(ResolveInstance <T>(c, request));
            });

            var rb = BuildRegistration(registrationDelegate)
                     .As(providedService)
                     .Targeting(serviceRegistration.Registration)
                     .InheritRegistrationOrderFrom(serviceRegistration.Registration);

            return(rb.CreateRegistration());
        }
Example #22
0
        private IComponentRegistration CreateLazyRegistration <T, TMeta>(Service providedService, Service valueService, IComponentRegistration valueRegistration)
        {
            var metadataProvider = MetadataViewProvider.GetMetadataViewProvider <TMeta>();

            var rb = RegistrationBuilder.ForDelegate(
                (c, p) =>
            {
                var context      = c.Resolve <IComponentContext>();
                var lazyType     = ((IServiceWithType)providedService).ServiceType;
                var request      = new ResolveRequest(valueService, valueRegistration, p);
                var valueFactory = new Func <T>(() => (T)context.ResolveComponent(request));
                var metadata     = metadataProvider(valueRegistration.Target.Metadata);
                return(Activator.CreateInstance(lazyType, valueFactory, metadata));
            })
                     .As(providedService)
                     .Targeting(valueRegistration, IsAdapterForIndividualComponents);

            return(rb.CreateRegistration());
        }
Example #23
0
        /// <summary>
        /// Executes the newly-registered build callbacks for a given scope/container..
        /// </summary>
        /// <param name="scope">The new scope/container.</param>
        internal static void RunBuildCallbacks(ILifetimeScope scope)
        {
            var buildCallbackServices = scope.ComponentRegistry.RegistrationsFor(CallbackServiceType);

            foreach (var srv in buildCallbackServices)
            {
                // Use the metadata to track whether we've executed already, to avoid issuing a resolve request.
                if (srv.Metadata.ContainsKey(BuildCallbacksExecutedKey))
                {
                    continue;
                }

                var request   = new ResolveRequest(CallbackServiceType, srv, Enumerable.Empty <Parameter>());
                var component = (BuildCallbackService)scope.ResolveComponent(request);
                srv.Metadata[BuildCallbacksExecutedKey] = true;

                // Run the callbacks for the relevant scope.
                component.Execute(scope);
            }
        }
        public async Task <HttpResponseMessage> ResolveBy(ResolveRequest request)
        {
            if (request.uniquemessageids != null)
            {
                if (request.uniquemessageids.Any(string.IsNullOrEmpty))
                {
                    return(Request.CreateResponse(HttpStatusCode.BadRequest));
                }

                foreach (var id in request.uniquemessageids)
                {
                    await messageSession.SendLocal(new MarkPendingRetryAsResolved { FailedMessageId = id })
                    .ConfigureAwait(false);
                }

                return(Request.CreateResponse(HttpStatusCode.Accepted));
            }

            DateTime from, to;

            try
            {
                from = DateTime.Parse(request.from, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
                to   = DateTime.Parse(request.to, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
            }
            catch (Exception)
            {
                return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "From/To"));
            }

            await messageSession.SendLocal <MarkPendingRetriesAsResolved>(m =>
            {
                m.PeriodFrom = from;
                m.PeriodTo   = to;
            }).ConfigureAwait(false);

            return(Request.CreateResponse(HttpStatusCode.Accepted));
        }
 public object ResolveComponent(ResolveRequest request)
 {
     return(GetCurrentScope().ResolveComponent(request));
 }
Example #26
0
 /// <inheritdoc />
 public object ResolveComponent(ResolveRequest request)
 {
     return(_rootLifetimeScope.ResolveComponent(request));
 }
Example #27
0
 /// <summary>
 /// Resolve an instance of the provided registration within the context.
 /// </summary>
 /// <param name="request">The resolve request.</param>
 /// <returns>
 /// The component instance.
 /// </returns>
 /// <exception cref="ComponentNotRegisteredException"/>
 /// <exception cref="Autofac.Core.DependencyResolutionException"/>
 public object ResolveComponent(ResolveRequest request)
 {
     return(_containerProvider.RequestLifetime.ResolveComponent(request));
 }
        public IEnumerable<IComponentRegistration> RegistrationsFor(Service service, Func<Service, IEnumerable<ServiceRegistration>> registrationAccessor)
        {
            if (service == null)
            {
                throw new ArgumentNullException(nameof(service));
            }

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

            if (!(service is IServiceWithType swt) || service is DecoratorService)
            {
                return Enumerable.Empty<IComponentRegistration>();
            }

            var serviceType = swt.ServiceType;
            Type? elementType = null;
            Type? limitType = null;
            Func<int, IList>? factory = null;

            if (serviceType.IsGenericTypeDefinedBy(typeof(IEnumerable<>)))
            {
                elementType = serviceType.GenericTypeArguments[0];
                limitType = elementType.MakeArrayType();
                factory = GenerateArrayFactory(elementType);
            }
            else if (serviceType.IsArray)
            {
                elementType = serviceType.GetElementType();
                limitType = serviceType;
                factory = GenerateArrayFactory(elementType);
            }
            else if (serviceType.IsGenericListOrCollectionInterfaceType())
            {
                elementType = serviceType.GenericTypeArguments[0];
                limitType = typeof(List<>).MakeGenericType(elementType);
                factory = GenerateListFactory(elementType);
            }

            if (elementType == null || factory == null || limitType == null)
            {
                return Enumerable.Empty<IComponentRegistration>();
            }

            var elementTypeService = swt.ChangeType(elementType);

            var activator = new DelegateActivator(
                limitType,
                (c, p) =>
                {
                    var itemRegistrations = c.ComponentRegistry
                        .ServiceRegistrationsFor(elementTypeService)
                        .Where(cr => !cr.Registration.Options.HasOption(RegistrationOptions.ExcludeFromCollections))
                        .OrderBy(cr => cr.Registration.GetRegistrationOrder())
                        .ToList();

                    var output = factory(itemRegistrations.Count);
                    var isFixedSize = output.IsFixedSize;

                    for (var i = 0; i < itemRegistrations.Count; i++)
                    {
                        var itemRegistration = itemRegistrations[i];
                        var resolveRequest = new ResolveRequest(elementTypeService, itemRegistration, p);
                        var component = c.ResolveComponent(resolveRequest);
                        if (isFixedSize)
                        {
                            output[i] = component;
                        }
                        else
                        {
                            output.Add(component);
                        }
                    }

                    return output;
                });

            var registration = new ComponentRegistration(
                Guid.NewGuid(),
                activator,
                CurrentScopeLifetime.Instance,
                InstanceSharing.None,
                InstanceOwnership.ExternallyOwned,
                new[] { service },
                new Dictionary<string, object?>());

            return new IComponentRegistration[] { registration };
        }
Example #29
0
 public object ResolveComponent(ResolveRequest request)
 {
     return(_context.GetOrCreateInstance(_activationScope, request));
 }
 /// <summary>
 /// Resolves an instance of the implicit type.
 /// </summary>
 /// <typeparam name="T">The child type used in the implicit type.</typeparam>
 /// <param name="ctx">A component context to resolve services.</param>
 /// <param name="request">A resolve request.</param>
 /// <returns>An implicit type instance.</returns>
 protected abstract object ResolveInstance <T>(IComponentContext ctx, ResolveRequest request)
     where T : notnull;