diff --git a/src/Utils/Extensions/Masa.Utils.Extensions.DependencyInjection/DefaultTypeProvider.cs b/src/Utils/Extensions/Masa.Utils.Extensions.DependencyInjection/DefaultTypeProvider.cs index 2f78931d9..b9784253a 100644 --- a/src/Utils/Extensions/Masa.Utils.Extensions.DependencyInjection/DefaultTypeProvider.cs +++ b/src/Utils/Extensions/Masa.Utils.Extensions.DependencyInjection/DefaultTypeProvider.cs @@ -48,11 +48,13 @@ public virtual List<Type> GetImplementationTypes(List<Type> types, Type serviceT public virtual List<Type> GetServiceTypes(List<Type> types, Type interfaceType) { var interfaceServiceTypes = types.Where(t => t.IsInterface && t != interfaceType && interfaceType.IsAssignableFrom(t)); - return types.Where(type - => IsAssignableFrom(interfaceType, type) && !type.GetInterfaces().Any(t => interfaceServiceTypes.Contains(t)) && - !IsSkip(type)) - .Concat(interfaceServiceTypes) - .ToList(); + var classServiceTypes = types.Where(type + => IsAssignableFrom(interfaceType, type) && + !interfaceServiceTypes.Any(t => IsAssignableFrom(t, type)) && + !IsSkip(type)); + + var list = new List<Type>(interfaceServiceTypes).Concat(classServiceTypes); + return list.ToList(); } public virtual bool IsSkip(Type type) diff --git a/src/Utils/Extensions/Masa.Utils.Extensions.DependencyInjection/IScopedDependency.cs b/src/Utils/Extensions/Masa.Utils.Extensions.DependencyInjection/IScopedDependency.cs index 75d0c6b21..9eb93ba06 100644 --- a/src/Utils/Extensions/Masa.Utils.Extensions.DependencyInjection/IScopedDependency.cs +++ b/src/Utils/Extensions/Masa.Utils.Extensions.DependencyInjection/IScopedDependency.cs @@ -6,16 +6,3 @@ namespace Microsoft.Extensions.DependencyInjection; public interface IScopedDependency { } - - -public interface ITestService<T> : IScopedDependency - where T : class -{ - -} - -public class TestSerice<T> : ITestService<T> - where T : class -{ - -} diff --git a/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/DependencyInjectionTest.cs b/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/DependencyInjectionTest.cs index a5aade41f..62fc98573 100644 --- a/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/DependencyInjectionTest.cs +++ b/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/DependencyInjectionTest.cs @@ -1,8 +1,6 @@ // Copyright (c) MASA Stack All rights reserved. // Licensed under the MIT License. See LICENSE.txt in the project root for license information. -using Masa.Utils.Extensions.DependencyInjection.Tests.Domain.Models; - namespace Masa.Utils.Extensions.DependencyInjection.Tests; [TestClass] @@ -32,12 +30,19 @@ public void TestSkip() } [TestMethod] - public void TestGetServiceTypesReturnCountIs5() + public void TestGetServiceTypesBySingletonReturnCountIs5() { var serviceTypes = _typeProvider.GetServiceTypes(_allTypes.ToList(), typeof(ISingletonDependency)); Assert.IsTrue(serviceTypes.Count == 5); } + [TestMethod] + public void TestGetServiceTypesByScopedReturnCountIs3() + { + var serviceTypes = _typeProvider.GetServiceTypes(_allTypes.ToList(), typeof(IScopedDependency)); + Assert.IsTrue(serviceTypes.Count == 3); + } + [TestMethod] public void TestGetImplementationTypesReturnCountIs1() { @@ -71,10 +76,13 @@ public void TestAssignableFrom() Assert.IsFalse(_typeProvider.IsAssignableFrom(typeof(RepositoryBase<>), typeof(IRepository<>))); Assert.IsFalse(_typeProvider.IsAssignableFrom(typeof(RepositoryBase<User>), typeof(IRepository<User>))); - Assert.IsTrue(_typeProvider.IsAssignableFrom(typeof(IRepository<,>), typeof(UserRepository<>))); - Assert.IsFalse(_typeProvider.IsAssignableFrom(typeof(IRepository<UserDbContext, User>), typeof(UserRepository<>))); - Assert.IsFalse(_typeProvider.IsAssignableFrom(typeof(UserRepository<>), typeof(IRepository<,>))); - Assert.IsTrue(_typeProvider.IsAssignableFrom(typeof(IRepository<UserDbContext, User>), typeof(UserRepository<User>))); + Assert.IsTrue(_typeProvider.IsAssignableFrom(typeof(IRepository<,>), typeof(RepositoryBase<,>))); + Assert.IsTrue(_typeProvider.IsAssignableFrom(typeof(IRepository<,>), typeof(TestRepository<>))); + Assert.IsFalse(_typeProvider.IsAssignableFrom(typeof(IRepository<UserDbContext, User>), typeof(RepositoryBase<>))); + Assert.IsFalse(_typeProvider.IsAssignableFrom(typeof(IRepository<UserDbContext, User>), typeof(UserRepository))); + Assert.IsFalse(_typeProvider.IsAssignableFrom(typeof(RepositoryBase<,>), typeof(IRepository<,>))); + Assert.IsTrue(_typeProvider.IsAssignableFrom(typeof(IRepository<UserDbContext, User>), + typeof(RepositoryBase<UserDbContext, User>))); } [TestMethod] @@ -100,10 +108,10 @@ public void TestAssignableTo() Assert.IsTrue(_typeProvider.IsAssignableTo(typeof(RepositoryBase<>), typeof(IRepository<>))); Assert.IsTrue(_typeProvider.IsAssignableTo(typeof(RepositoryBase<User>), typeof(IRepository<User>))); - Assert.IsFalse(_typeProvider.IsAssignableTo(typeof(IRepository<,>), typeof(UserRepository<>))); - Assert.IsFalse(_typeProvider.IsAssignableTo(typeof(IRepository<UserDbContext, User>), typeof(UserRepository<>))); - Assert.IsTrue(_typeProvider.IsAssignableTo(typeof(UserRepository<>), typeof(IRepository<,>))); - Assert.IsFalse(_typeProvider.IsAssignableTo(typeof(IRepository<UserDbContext, User>), typeof(UserRepository<User>))); + Assert.IsFalse(_typeProvider.IsAssignableTo(typeof(IRepository<,>), typeof(RepositoryBase<,>))); + Assert.IsFalse(_typeProvider.IsAssignableTo(typeof(IRepository<UserDbContext, User>), typeof(RepositoryBase<,>))); + Assert.IsTrue(_typeProvider.IsAssignableTo(typeof(RepositoryBase<,>), typeof(IRepository<,>))); + Assert.IsFalse(_typeProvider.IsAssignableTo(typeof(IRepository<UserDbContext, User>), typeof(RepositoryBase<,>))); } [TestMethod] @@ -161,6 +169,12 @@ public void TestAddAutoInjectMultiReturnCountIs1() var serviceProvider = services.BuildServiceProvider(); Assert.IsNotNull(serviceProvider.GetService<IRepository<User>>()); Assert.IsTrue(serviceProvider.GetServices<IRepository<User>>().Count() == 1); + + Assert.IsNull(serviceProvider.GetService<Repository<User>>()); + Assert.IsNull(serviceProvider.GetService<RepositoryBase<UserDbContext, User>>()); + Assert.IsNull(serviceProvider.GetService<UserRepository>()); + Assert.IsNotNull(serviceProvider.GetService<IUserRepository>()); + Assert.IsNull(serviceProvider.GetService<UserRepository>()); } [TestMethod] diff --git a/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Domain/Repositories/IUserRepository.cs b/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Domain/Repositories/IUserRepository.cs new file mode 100644 index 000000000..c411e846f --- /dev/null +++ b/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Domain/Repositories/IUserRepository.cs @@ -0,0 +1,9 @@ +// Copyright (c) MASA Stack All rights reserved. +// Licensed under the MIT License. See LICENSE.txt in the project root for license information. + +namespace Masa.Utils.Extensions.DependencyInjection.Tests.Domain.Repositories; + +public interface IUserRepository : IRepository<User> +{ + +} diff --git a/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Infrastructure/Repositories/RepositoryBase.cs b/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Infrastructure/Repositories/RepositoryBase.cs index 3af58a6f9..d8cd77811 100644 --- a/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Infrastructure/Repositories/RepositoryBase.cs +++ b/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Infrastructure/Repositories/RepositoryBase.cs @@ -15,7 +15,14 @@ public class Repository<TEntity> : RepositoryBase<TEntity> } -public class UserRepository<TEntity> : IRepository<UserDbContext, TEntity> +public class RepositoryBase<TDbContext, TEntity> : IRepository<TDbContext, TEntity> + where TEntity : class + where TDbContext : class +{ + +} + +public class TestRepository<TEntity> : IRepository<UserDbContext, TEntity> where TEntity : class { diff --git a/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Infrastructure/Repositories/UserRepository.cs b/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Infrastructure/Repositories/UserRepository.cs new file mode 100644 index 000000000..5f4218353 --- /dev/null +++ b/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Infrastructure/Repositories/UserRepository.cs @@ -0,0 +1,9 @@ +// Copyright (c) MASA Stack All rights reserved. +// Licensed under the MIT License. See LICENSE.txt in the project root for license information. + +namespace Masa.Utils.Extensions.DependencyInjection.Tests.Infrastructure.Repositories; + +public class UserRepository : IUserRepository +{ + +} diff --git a/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Infrastructure/Services/CustomizeClientFactory.cs b/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Infrastructure/Services/CustomizeClientFactory.cs index 3cafaac57..7395cda56 100644 --- a/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Infrastructure/Services/CustomizeClientFactory.cs +++ b/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Infrastructure/Services/CustomizeClientFactory.cs @@ -1,8 +1,6 @@ // Copyright (c) MASA Stack All rights reserved. // Licensed under the MIT License. See LICENSE.txt in the project root for license information. -using Masa.Utils.Extensions.DependencyInjection.Tests.Domain.Services; - namespace Masa.Utils.Extensions.DependencyInjection.Tests.Infrastructure.Services; [Dependency(ReplaceServices = true)] diff --git a/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Infrastructure/Services/EmptyClientFactory.cs b/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Infrastructure/Services/EmptyClientFactory.cs index 71f985d86..220ed1edd 100644 --- a/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Infrastructure/Services/EmptyClientFactory.cs +++ b/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Infrastructure/Services/EmptyClientFactory.cs @@ -1,8 +1,6 @@ // Copyright (c) MASA Stack All rights reserved. // Licensed under the MIT License. See LICENSE.txt in the project root for license information. -using Masa.Utils.Extensions.DependencyInjection.Tests.Domain.Services; - namespace Masa.Utils.Extensions.DependencyInjection.Tests.Infrastructure.Services; public class EmptyClientFactory : IClientFactory diff --git a/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Infrastructure/Services/NullCalculateProviderService.cs b/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Infrastructure/Services/NullCalculateProviderService.cs index 969a46ac6..f812f05c0 100644 --- a/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Infrastructure/Services/NullCalculateProviderService.cs +++ b/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/Infrastructure/Services/NullCalculateProviderService.cs @@ -1,8 +1,6 @@ // Copyright (c) MASA Stack All rights reserved. // Licensed under the MIT License. See LICENSE.txt in the project root for license information. -using Masa.Utils.Extensions.DependencyInjection.Tests.Domain.Services; - namespace Masa.Utils.Extensions.DependencyInjection.Tests.Infrastructure.Services; public class NullCalculateProviderService : ICalculateProviderService diff --git a/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/_Imports.cs b/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/_Imports.cs index 695649bde..1224143c3 100644 --- a/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/_Imports.cs +++ b/src/Utils/Extensions/Tests/Masa.Utils.Extensions.DependencyInjection.Tests/_Imports.cs @@ -1,6 +1,7 @@ // Copyright (c) MASA Stack All rights reserved. // Licensed under the MIT License. See LICENSE.txt in the project root for license information. +global using Masa.Utils.Extensions.DependencyInjection.Tests.Domain.Models; global using Masa.Utils.Extensions.DependencyInjection.Tests.Domain.Repositories; global using Masa.Utils.Extensions.DependencyInjection.Tests.Domain.Services; global using Masa.Utils.Extensions.DependencyInjection.Tests.Infrastructure;