예제 #1
0
        static void Main(string[] args)
        {
            //创建一个容器
            IServiceContainer services = new ServiceContainer();

            services.Configure(config =>
            {
                config.Interceptors.AddTyped <SampleInterceptor>();
            });

            services.AddType <ISampleService, SampleService>();
            services.AddType <ISampleRepository, SampleRepository>();

            //使用类型注册服务
            services.AddType <ILogger, Logger>();
            //使用实例注册服务,服务的生命周期限定为单例
            services.AddInstance <ITaskService>(new TaskService());
            //使用委托工厂注册服务
            services.AddDelegate <ITaskService, TaskService>(resolver => new TaskService());

            //创建服务解析器
            IServiceResolver serviceResolver = services.Build();

            //解析单个服务
            ISampleService sampleService = serviceResolver.Resolve <ISampleService>();

            //解析单个服务,并且验证是否为null,为null则抛出异常
            ISampleService sampleServiceRequired = serviceResolver.ResolveRequired <ISampleService>();

            //解析服务集合,如果未注册,则为空集合
            IEnumerable <ISampleService> sampleServices = serviceResolver.ResolveMany <ISampleService>();
        }
        public object Invoke(IServiceResolver resolver, object instance, ServiceDefinition service)
        {
            if (instance == null || instance is IConfiguration)
            {
                return(instance);
            }

            var instanceType  = instance.GetType();
            var configuration = resolver.ResolveRequired <IConfiguration>();

            foreach (var field in instanceType.GetFields(_flags))
            {
                var reflector             = field.GetReflector();
                var configurationMetadata = reflector.GetCustomAttribute <ConfigurationMetadataAttribute>();
                if (configurationMetadata == null)
                {
                    continue;
                }

                var section = configurationMetadata.GetSection();
                if (configurationMetadata.Type == ConfigurationBindType.Value)
                {
                    var key = section == null ? configurationMetadata.Key : section + ":" + configurationMetadata.Key;
                    reflector.SetValue(instance, configuration.GetValue(field.FieldType, key));
                }
                else
                {
                    var configurationSection = section == null ? configuration : configuration.GetSection(section);
                    reflector.SetValue(instance, configurationSection.Get(field.FieldType));
                }
            }

            return(instance);
        }
        internal static void AllDone(ILogServiceCollection services)
        {
            if (services is ConsoleLogServiceCollection loggingServices)
            {
                using (loggingServices) {
                    loggingServices.ActiveConsolePreferencesRenderers();

                    loggingServices.RegisterCoreComponents();

                    loggingServices.BuildAndActiveConfiguration();

                    loggingServices.AddTraceIdGenerator();
                }

                ServiceResolver = loggingServices.OriginalServices.ToServiceContext().Build();

                loggingServices.ActiveLogEventEnrichers();

                StaticServiceResolver.SetResolver(ServiceResolver.ResolveRequired <ILoggingServiceProvider>());
            }
            else
            {
                throw new ArgumentException(nameof(services));
            }
        }
 public object GetRequiredService(Type serviceType)
 {
     if (serviceType == null)
     {
         throw new ArgumentNullException(nameof(serviceType));
     }
     return(_serviceResolver.ResolveRequired(serviceType));
 }
예제 #5
0
 public static T ResolveRequired <T>(this IServiceResolver serviceResolver)
 {
     if (serviceResolver == null)
     {
         throw new ArgumentNullException(nameof(serviceResolver));
     }
     return((T)serviceResolver.ResolveRequired(typeof(T)));
 }
예제 #6
0
        public static IEnumerable <T> ResolveMany <T>(this IServiceResolver serviceResolver)
        {
            if (serviceResolver == null)
            {
                throw new ArgumentNullException(nameof(serviceResolver));
            }

            return(serviceResolver.ResolveRequired <IManyEnumerable <T> >());
        }
예제 #7
0
        public static IEnumerable <object> ResolveMany(this IServiceResolver serviceResolver, Type serviceType)
        {
            if (serviceResolver == null)
            {
                throw new ArgumentNullException(nameof(serviceResolver));
            }

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

            var genericEnumerable = typeof(IManyEnumerable <>).MakeGenericType(serviceType);

            return((IManyEnumerable <object>)serviceResolver.ResolveRequired(genericEnumerable));
        }
 internal static void AllDone(ILogServiceCollection services)
 {
     if (services is ConsoleLogServiceCollection servicesImpl)
     {
         servicesImpl.BuildConfiguration();
         servicesImpl.ActiveSinkSettings();
         servicesImpl.ActiveOriginConfiguration();
         servicesImpl.AddDependency(s => s.TryAdd(ServiceDescriptor.Singleton(Options.Create((LoggingOptions)servicesImpl.ExposeLogSettings()))));
         servicesImpl.AddDependency(s => s.TryAdd(ServiceDescriptor.Singleton(servicesImpl.ExposeLoggingConfiguration())));
         ServiceResolver = servicesImpl.ExposeServices().ToServiceContainer().Build();
         StaticServiceResolver.SetResolver(ServiceResolver.ResolveRequired <ILoggingServiceProvider>());
     }
     else
     {
         throw new ArgumentException(nameof(services));
     }
 }
 public DisposedProxyGenerator(IServiceResolver serviceResolver)
 {
     _serviceResolver = serviceResolver;
     _proxyGenerator  = serviceResolver.ResolveRequired <IProxyGenerator>();
 }
예제 #10
0
 /// <inheritdoc />
 public object RequiredResolve(Type serviceType) => _resolver.ResolveRequired(serviceType);