diff --git a/Src/Asp.NetCore2/SqlSugar/Interface/ISimpleClient.cs b/Src/Asp.NetCore2/SqlSugar/Interface/ISimpleClient.cs index 573c033f4..584fea882 100644 --- a/Src/Asp.NetCore2/SqlSugar/Interface/ISimpleClient.cs +++ b/Src/Asp.NetCore2/SqlSugar/Interface/ISimpleClient.cs @@ -9,6 +9,7 @@ namespace SqlSugar public interface ISimpleClient where T : class, new() { SimpleClient CopyNew(); + RepositoryType CopyNew(IServiceProvider serviceProvider) where RepositoryType : ISugarRepository; RepositoryType CopyNew() where RepositoryType : ISugarRepository; SimpleClient Change() where ChangeType : class, new(); RepositoryType ChangeRepository() where RepositoryType : ISugarRepository ; diff --git a/Src/Asp.NetCore2/SqlSugar/SimpleClient.cs b/Src/Asp.NetCore2/SqlSugar/SimpleClient.cs index 0860fb459..b907d095a 100644 --- a/Src/Asp.NetCore2/SqlSugar/SimpleClient.cs +++ b/Src/Asp.NetCore2/SqlSugar/SimpleClient.cs @@ -77,6 +77,78 @@ namespace SqlSugar } return result; } + public RepositoryType CopyNew(IServiceProvider serviceProvider) where RepositoryType : ISugarRepository + { + var instance = handleDependencies(typeof(RepositoryType), serviceProvider); + return (RepositoryType)instance; + } + + private object handleDependencies(Type type, IServiceProvider serviceProvider) + { + ConstructorInfo constructorInfo = null; + var newInstanceType = type; + if (type.IsInterface && IsAssignableToBaseRepository(type)) + { + var dependencyInstanceType = serviceProvider.GetService(type)?.GetType(); + newInstanceType = dependencyInstanceType; + constructorInfo = dependencyInstanceType.GetConstructors().FirstOrDefault(); + } + else + { + constructorInfo = type.GetConstructors().FirstOrDefault(); + } + var parameters = constructorInfo?.GetParameters(); + if (parameters == null || parameters.Length == 0) + { + object dependencyInstance = serviceProvider.GetService(type); + if (dependencyInstance is ISugarRepository sugarRepository) + { + sugarRepository.Context = sugarRepository.Context.CopyNew(); + return sugarRepository; + } + else + { + return dependencyInstance; + } + } + + var conParas = new List(); + foreach (var parameter in parameters) + { + Type dependencyType = parameter.ParameterType; + conParas.Add(handleDependencies(dependencyType, serviceProvider)); + } + + object instance = null; + if (conParas != null && conParas.Count > 0) + { + instance = Activator.CreateInstance(newInstanceType, conParas.ToArray()); + } + else + { + instance = Activator.CreateInstance(newInstanceType); + } + return instance; + } + + private bool IsAssignableToBaseRepository(Type type) + { + var baseInterfaces = type.GetInterfaces(); + foreach (Type interfaceType in baseInterfaces) + { + if (interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof(ISimpleClient<>)) + { + Type genericArgument = interfaceType.GetGenericArguments()[0]; + Type baseRepositoryGenericType = typeof(ISimpleClient<>).MakeGenericType(genericArgument); + + if (baseRepositoryGenericType.IsAssignableFrom(type)) + { + return true; + } + } + } + return false; + } public RepositoryType ChangeRepository() where RepositoryType : ISugarRepository { Type type = typeof(RepositoryType);