public IRegistrationBuilder <TLimit> As(Type service) { if (!service.IsAssignableFrom(DefaultType)) { MiniException.UnExpectedOperated(typeof(RegistrationBuilder <>), $"register type must assign from {DefaultType.FullName}"); } RegistrationData.AddServices(new TypedService(service)); return(this); }
private static void ScanAssembly(IComponentRegistry componentRegistry, Assembly assembly) { var types = assembly.GetTypes() .Where(type => (type.IsClass && !type.IsAbstract) && (!type.IsGenericTypeDefinition && !type.IsSubclassOf(typeof(Delegate)))) .ToArray(); foreach (var type in types) { var implementedInterfaces = GetImplementedInterfaces(type); if (!implementedInterfaces.Any()) continue; if (!HasMarkerAttribute(type)) { var interfaceName = "I" + type.Name; if (implementedInterfaces.All(interfaceType => interfaceType.Name != interfaceName)) continue; } var typedService = new TypedService(type); var data = new RegistrationData(typedService); data.AddServices( implementedInterfaces.Select( t => { if (t.FullName == null) { return new TypedService(t.GetGenericTypeDefinition()); } return new TypedService(t); }).ToArray()); if (IsSingleInstancing(typedService.ServiceType)) { data.Sharing = InstanceSharing.Shared; data.Lifetime = new RootScopeLifetime(); } else if (IsInstancingPerLifetimeScope(typedService.ServiceType)) { data.Sharing = InstanceSharing.Shared; data.Lifetime = new MatchingScopeLifetime(LifetimeScopeTags.RequestScope); } var registration = RegistrationBuilder.CreateRegistration( Guid.NewGuid(), data, new ConcreteReflectionActivatorData(typedService.ServiceType).Activator, data.Services); componentRegistry.Register(registration); } }