Пример #1
0
        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);
            }
        }