From c1b460a47849a3102df3a9c91237c8567dd277e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=9F=B3=E5=A4=B4?= Date: Thu, 29 Feb 2024 16:25:25 +0800 Subject: [PATCH] =?UTF-8?q?[feat]=20=E6=96=B0=E5=A2=9EIServiceProvider.Cre?= =?UTF-8?q?ateInstance=EF=BC=8C=E5=88=9B=E5=BB=BA=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=EF=BC=8C=E4=BD=BF=E7=94=A8=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E6=8F=90=E4=BE=9B=E8=80=85=E6=9D=A5=E5=A1=AB=E5=85=85=E6=9E=84?= =?UTF-8?q?=E9=80=A0=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NewLife.Core/Model/ModelExtension.cs | 24 +++++++++++++++--------- NewLife.Core/Model/ObjectContainer.cs | 23 ++++++++++++++++------- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/NewLife.Core/Model/ModelExtension.cs b/NewLife.Core/Model/ModelExtension.cs index 9ace4b863..16f162c06 100644 --- a/NewLife.Core/Model/ModelExtension.cs +++ b/NewLife.Core/Model/ModelExtension.cs @@ -18,8 +18,8 @@ public static class ModelExtension } /// 获取必要的服务,不存在时抛出异常 - /// - /// + /// 服务提供者 + /// 服务类型 /// public static Object GetRequiredService(this IServiceProvider provider, Type serviceType) { @@ -30,20 +30,20 @@ public static Object GetRequiredService(this IServiceProvider provider, Type ser } /// 获取必要的服务,不存在时抛出异常 - /// - /// + /// 服务类型 + /// 服务提供者 /// public static T GetRequiredService(this IServiceProvider provider) => provider == null ? throw new ArgumentNullException(nameof(provider)) : (T)provider.GetRequiredService(typeof(T)); /// 获取一批服务 - /// - /// + /// 服务类型 + /// 服务提供者 /// public static IEnumerable GetServices(this IServiceProvider provider) => provider.GetServices(typeof(T)).Cast(); /// 获取一批服务 - /// - /// + /// 服务提供者 + /// 服务类型 /// public static IEnumerable GetServices(this IServiceProvider provider, Type serviceType) { @@ -78,7 +78,13 @@ public static IEnumerable GetServices(this IServiceProvider provider, Ty } /// 创建范围作用域,该作用域内提供者解析一份数据 - /// + /// 服务提供者 /// public static IServiceScope? CreateScope(this IServiceProvider provider) => provider.GetService()?.CreateScope(); + + /// 创建服务对象,使用服务提供者来填充构造函数 + /// 服务提供者 + /// 服务类型 + /// + public static Object CreateInstance(this IServiceProvider provider, Type serviceType) => ObjectContainer.CreateInstance(serviceType, provider, null); } \ No newline at end of file diff --git a/NewLife.Core/Model/ObjectContainer.cs b/NewLife.Core/Model/ObjectContainer.cs index a9032914e..e5e73b21a 100644 --- a/NewLife.Core/Model/ObjectContainer.cs +++ b/NewLife.Core/Model/ObjectContainer.cs @@ -1,6 +1,5 @@ using System.ComponentModel; using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; using System.Reflection; namespace NewLife.Model; @@ -13,10 +12,17 @@ public class ObjectContainer : IObjectContainer { #region 静态 /// 当前容器 - public static IObjectContainer Current { get; set; } = new ObjectContainer(); + public static IObjectContainer Current { get; set; } /// 当前容器提供者 - public static IServiceProvider Provider { get; set; } = new ServiceProvider(Current); + public static IServiceProvider Provider { get; set; } + + static ObjectContainer() + { + var ioc = new ObjectContainer(); + Current = ioc; + Provider = ioc.BuildServiceProvider() ?? new ServiceProvider(ioc); + } #endregion #region 属性 @@ -117,27 +123,30 @@ public virtual IObjectContainer Register(Type serviceType, Type? implementationT public virtual Object Resolve(IObject item, IServiceProvider? serviceProvider) { var map = item as ServiceDescriptor; + if (item.Lifetime == ObjectLifetime.Singleton && map?.Instance != null) return map.Instance; + var type = item.ImplementationType ?? item.ServiceType; + serviceProvider ??= new ServiceProvider(this); switch (item.Lifetime) { case ObjectLifetime.Singleton: if (map != null) { - map.Instance ??= CreateInstance(type, serviceProvider ?? new ServiceProvider(this), map.Factory); + map.Instance ??= CreateInstance(type, serviceProvider, map.Factory); return map.Instance; } - return CreateInstance(type, serviceProvider ?? new ServiceProvider(this), null); + return CreateInstance(type, serviceProvider, null); case ObjectLifetime.Scoped: case ObjectLifetime.Transient: default: - return CreateInstance(type, serviceProvider ?? new ServiceProvider(this), map?.Factory); + return CreateInstance(type, serviceProvider, map?.Factory); } } private static IDictionary? _defs; - private static Object CreateInstance(Type type, IServiceProvider provider, Func? factory) + internal static Object CreateInstance(Type type, IServiceProvider provider, Func? factory) { if (factory != null) return factory(provider);