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