Skip to content

Commit

Permalink
[feat] 新增IServiceProvider.CreateInstance,创建服务对象,使用服务提供者来填充构造函数
Browse files Browse the repository at this point in the history
  • Loading branch information
nnhy committed Feb 29, 2024
1 parent 5530425 commit c1b460a
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 16 deletions.
24 changes: 15 additions & 9 deletions NewLife.Core/Model/ModelExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ public static class ModelExtension
}

/// <summary>获取必要的服务,不存在时抛出异常</summary>
/// <param name="provider"></param>
/// <param name="serviceType"></param>
/// <param name="provider">服务提供者</param>
/// <param name="serviceType">服务类型</param>
/// <returns></returns>
public static Object GetRequiredService(this IServiceProvider provider, Type serviceType)
{
Expand All @@ -30,20 +30,20 @@ public static Object GetRequiredService(this IServiceProvider provider, Type ser
}

/// <summary>获取必要的服务,不存在时抛出异常</summary>
/// <typeparam name="T"></typeparam>
/// <param name="provider"></param>
/// <typeparam name="T">服务类型</typeparam>
/// <param name="provider">服务提供者</param>
/// <returns></returns>
public static T GetRequiredService<T>(this IServiceProvider provider) => provider == null ? throw new ArgumentNullException(nameof(provider)) : (T)provider.GetRequiredService(typeof(T));

/// <summary>获取一批服务</summary>
/// <typeparam name="T"></typeparam>
/// <param name="provider"></param>
/// <typeparam name="T">服务类型</typeparam>
/// <param name="provider">服务提供者</param>
/// <returns></returns>
public static IEnumerable<T> GetServices<T>(this IServiceProvider provider) => provider.GetServices(typeof(T)).Cast<T>();

/// <summary>获取一批服务</summary>
/// <param name="provider"></param>
/// <param name="serviceType"></param>
/// <param name="provider">服务提供者</param>
/// <param name="serviceType">服务类型</param>
/// <returns></returns>
public static IEnumerable<Object> GetServices(this IServiceProvider provider, Type serviceType)
{
Expand Down Expand Up @@ -78,7 +78,13 @@ public static IEnumerable<Object> GetServices(this IServiceProvider provider, Ty
}

/// <summary>创建范围作用域,该作用域内提供者解析一份数据</summary>
/// <param name="provider"></param>
/// <param name="provider">服务提供者</param>
/// <returns></returns>
public static IServiceScope? CreateScope(this IServiceProvider provider) => provider.GetService<IServiceScopeFactory>()?.CreateScope();

/// <summary>创建服务对象,使用服务提供者来填充构造函数</summary>
/// <param name="provider">服务提供者</param>
/// <param name="serviceType">服务类型</param>
/// <returns></returns>
public static Object CreateInstance(this IServiceProvider provider, Type serviceType) => ObjectContainer.CreateInstance(serviceType, provider, null);
}
23 changes: 16 additions & 7 deletions NewLife.Core/Model/ObjectContainer.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using System.ComponentModel;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Reflection;

namespace NewLife.Model;
Expand All @@ -13,10 +12,17 @@ public class ObjectContainer : IObjectContainer
{
#region 静态
/// <summary>当前容器</summary>
public static IObjectContainer Current { get; set; } = new ObjectContainer();
public static IObjectContainer Current { get; set; }

/// <summary>当前容器提供者</summary>
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 属性
Expand Down Expand Up @@ -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<TypeCode, Object?>? _defs;
private static Object CreateInstance(Type type, IServiceProvider provider, Func<IServiceProvider, Object>? factory)
internal static Object CreateInstance(Type type, IServiceProvider provider, Func<IServiceProvider, Object>? factory)
{
if (factory != null) return factory(provider);

Expand Down

0 comments on commit c1b460a

Please sign in to comment.