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));
            }

            if (_registrationData.Services.Contains(service))
            {
                return(registrationAccessor(_activatorData.FromService)
                       .Select(r =>
                {
                    var rb = RegistrationBuilder
                             .ForDelegate((c, p) => _activatorData.Adapter(c, Enumerable.Empty <Parameter>(), c.ResolveComponent(r, p)))
                             .Targeting(r)
                             .InheritRegistrationOrderFrom(r);

                    rb.RegistrationData.CopyFrom(_registrationData, true);

                    return rb.CreateRegistration();
                }));
            }

            var requestedServiceWithType = service as IServiceWithType;
            var adapteeServiceWithType   = _activatorData.FromService as IServiceWithType;

            if (
                //// requested and adaptee are services with type
                //// not including decorators here
                //// and if this registration source contains requested service's type
                (requestedServiceWithType != null && adapteeServiceWithType != null) &&
                (requestedServiceWithType.ServiceType != adapteeServiceWithType.ServiceType) &&
                _registrationData.Services.OfType <IServiceWithType>().Any(s => s.ServiceType == requestedServiceWithType.ServiceType))
            {
                // we try to find registrations for the adaptee service but preserve info from the requested service e.g. keys
                var serviceToFind = requestedServiceWithType.ChangeType(adapteeServiceWithType.ServiceType);

                return(registrationAccessor(serviceToFind)
                       .Select(r =>
                {
                    var rb = RegistrationBuilder
                             .ForDelegate((c, p) => _activatorData.Adapter(c, p, c.ResolveComponent(r, Enumerable.Empty <Parameter>())))
                             .Targeting(r);

                    rb.RegistrationData.CopyFrom(_registrationData, true);

                    // we explicitly add requested service to the RegistrationData
                    rb.RegistrationData.AddService(service);

                    return rb.CreateRegistration();
                }));
            }

            return(Enumerable.Empty <IComponentRegistration>());
        }
示例#2
0
        public IEnumerable <IComponentRegistration> RegistrationsFor(Service service, Func <Service, IEnumerable <IComponentRegistration> > registrationAccessor)
        {
            if (service == null)
            {
                throw new ArgumentNullException("service");
            }
            if (registrationAccessor == null)
            {
                throw new ArgumentNullException("registrationAccessor");
            }

            if (_registrationData.Services.Contains(service))
            {
                return(registrationAccessor(_activatorData.FromService)
                       .Select(r =>
                {
                    var rb = RegistrationBuilder
                             .ForDelegate((c, p) => _activatorData.Adapter(c, p, c.ResolveComponent(r, Enumerable.Empty <Parameter>())))
                             .Targeting(r);

                    rb.RegistrationData.CopyFrom(_registrationData, true);

                    return rb.CreateRegistration();
                }));
            }

            return(new IComponentRegistration[0]);
        }