diff --git a/Gear.Test.Api/Controllers/WeatherForecastController.cs b/Gear.Test.Api/Controllers/WeatherForecastController.cs index 239fec7..d2fca9f 100644 --- a/Gear.Test.Api/Controllers/WeatherForecastController.cs +++ b/Gear.Test.Api/Controllers/WeatherForecastController.cs @@ -1,4 +1,5 @@ using Gear.Abstractions; +using Gear.Test.Api.Uses; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; @@ -15,7 +16,7 @@ namespace Gear.Test.Api.Controllers { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; - + private ITestUse TestUse => LazyServiceProvider.LazyGetService(); public IEnumerable Get() { @@ -30,5 +31,9 @@ namespace Gear.Test.Api.Controllers }) .ToArray(); } + public string GetUse() + { + return TestUse.HelloUse(); + } } } diff --git a/Gear.Test.Api/Uses/ITestUse.cs b/Gear.Test.Api/Uses/ITestUse.cs new file mode 100644 index 0000000..b73d8b5 --- /dev/null +++ b/Gear.Test.Api/Uses/ITestUse.cs @@ -0,0 +1,13 @@ +using Gear.Abstractions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Gear.Test.Api.Uses +{ + public interface ITestUse + { + string HelloUse(); + } +} diff --git a/Gear.Test.Api/Uses/TestUse.cs b/Gear.Test.Api/Uses/TestUse.cs new file mode 100644 index 0000000..905e1f8 --- /dev/null +++ b/Gear.Test.Api/Uses/TestUse.cs @@ -0,0 +1,16 @@ +using Gear.Abstractions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Gear.Test.Api.Uses +{ + public class TestUse : Use, ITestUse + { + public string HelloUse() + { + return "Hello Use!"; + } + } +} diff --git a/Gear/Gear.csproj b/Gear/Gear.csproj index 8cc7409..7bdb9b0 100644 --- a/Gear/Gear.csproj +++ b/Gear/Gear.csproj @@ -8,7 +8,7 @@ 全网科技 true Gear - 0.1.7 + 0.1.8 Gear Gear diff --git a/Gear/Gear/Abstractions/Use.cs b/Gear/Gear/Abstractions/Use.cs index f3066b7..0c2721e 100644 --- a/Gear/Gear/Abstractions/Use.cs +++ b/Gear/Gear/Abstractions/Use.cs @@ -13,7 +13,7 @@ namespace Gear.Abstractions /// /// 用例 /// - public abstract class Use + public abstract class Use { protected Use() { } diff --git a/Gear/Gear/Infrastructure/Extensions/FreeSqlManager.cs b/Gear/Gear/Infrastructure/Extensions/FreeSqlManager.cs index 001b7d9..e77d12b 100644 --- a/Gear/Gear/Infrastructure/Extensions/FreeSqlManager.cs +++ b/Gear/Gear/Infrastructure/Extensions/FreeSqlManager.cs @@ -32,7 +32,12 @@ namespace Gear.Infrastructure.Extensions } public static IFreeSql GetFreeSql(string configurationKey = "ConnectionString") { - return ib.Get(configurationKey); + if (ib.GetKeys().Any(o => o == configurationKey)) + { + return ib.Get(configurationKey); + } + + return null; } } } diff --git a/Gear/Gear/Infrastructure/Extensions/ServiceCollectionServiceExtensions.cs b/Gear/Gear/Infrastructure/Extensions/ServiceCollectionServiceExtensions.cs index b81a7ad..ef80c04 100644 --- a/Gear/Gear/Infrastructure/Extensions/ServiceCollectionServiceExtensions.cs +++ b/Gear/Gear/Infrastructure/Extensions/ServiceCollectionServiceExtensions.cs @@ -16,6 +16,7 @@ using Serilog; using Serilog.Events; using Serilog.Sinks.Grafana.Loki; using System; +using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.Loader; @@ -24,7 +25,7 @@ namespace Gear.Infrastructure.Extensions { public static class ServiceCollectionServiceExtensions { - + /// /// 齿轮配置 Gear.Abstractions 中的默认功能 /// @@ -42,62 +43,103 @@ namespace Gear.Infrastructure.Extensions assemblies.Add(typeof(ServiceCollectionServiceExtensions).Assembly); } + services.AddLocalServiceLifetime(assemblies); + + services.AddHttpContextAccessor(); + + services.AddAutoMapper(assemblies); + + services.Configure(options => + { + options.Conventions.Add(new ApplicationConvention()); + options.Filters.Add(); + options.Filters.Add(); + }); + + return services; + } + + private static void AddLocalServiceLifetime(this IServiceCollection services, List assemblies) + { foreach (var assembly in assemblies) { var types = assembly.GetTypes(); - foreach (var type in types.Where(o => !o.IsInterface && !o.IsAbstract && o.IsClass && - typeof(ITransientDependency) != o && typeof(ITransientDependency).IsAssignableFrom(o))) - { - var interfaceType = type.GetInterfaces().FirstOrDefault(interfaceType => interfaceType.Name.EndsWith(type.Name)); + services.AddUses(types); - if (interfaceType != null) - services.TryAddTransient(interfaceType, type); - else - services.TryAddTransient(type, type); + services.AddTransientDependency(types); - } + services.AddSingletonDependency(types); - foreach (var type in types.Where(o => !o.IsInterface && !o.IsAbstract && o.IsClass && - typeof(ISingletonDependency) != o && typeof(ISingletonDependency).IsAssignableFrom(o))) - { - var interfaceType = type.GetInterfaces().FirstOrDefault(interfaceType => interfaceType.Name.EndsWith(type.Name)); - - if (interfaceType != null) - services.TryAddSingleton(interfaceType, type); - else - services.TryAddSingleton(type, type); + services.AddScopedDependency(types); + } + } - } + private static void AddUses(this IServiceCollection services, Type[] types) + { + foreach (var type in types.Where(o => !o.IsInterface && !o.IsAbstract && o.IsClass && + !typeof(AppService).IsAssignableFrom(o) && + typeof(Use) != o && + typeof(Use).IsAssignableFrom(o))) + { + var interfaceType = type.GetInterfaces().FirstOrDefault(interfaceType => interfaceType.Name.EndsWith(type.Name)); - foreach (var type in types.Where(o => !o.IsInterface && !o.IsAbstract && o.IsClass && - typeof(IScopedDependency) != o && typeof(IScopedDependency).IsAssignableFrom(o))) + services.TryAddTransient(type, type); + services.TryAddTransient(interfaceType, o => { - var interfaceType = type.GetInterfaces().FirstOrDefault(interfaceType => interfaceType.Name.EndsWith(type.Name)); + Use use = (Use)o.GetService(type); + use.LazyServiceProvider = o.GetService(); + return use; + }); + } + } - if (interfaceType != null) - services.TryAddScoped(interfaceType, type); - else - services.TryAddScoped(type, type); + private static void AddScopedDependency(this IServiceCollection services, Type[] types) + { + foreach (var type in types.Where(o => !o.IsInterface && !o.IsAbstract && o.IsClass && + typeof(IScopedDependency) != o && typeof(IScopedDependency).IsAssignableFrom(o))) + { + var interfaceType = type.GetInterfaces().FirstOrDefault(interfaceType => interfaceType.Name.EndsWith(type.Name)); - } + if (interfaceType != null) + services.TryAddScoped(interfaceType, type); + else + services.TryAddScoped(type, type); } + } - services.AddHttpContextAccessor(); + private static void AddSingletonDependency(this IServiceCollection services, Type[] types) + { + foreach (var type in types.Where(o => !o.IsInterface && !o.IsAbstract && o.IsClass && + typeof(ISingletonDependency) != o && typeof(ISingletonDependency).IsAssignableFrom(o))) + { + var interfaceType = type.GetInterfaces().FirstOrDefault(interfaceType => interfaceType.Name.EndsWith(type.Name)); - services.AddAutoMapper(assemblies); + if (interfaceType != null) + services.TryAddSingleton(interfaceType, type); + else + services.TryAddSingleton(type, type); - services.Configure(options => + } + } + + private static void AddTransientDependency(this IServiceCollection services, Type[] types) + { + foreach (var type in types.Where(o => !o.IsInterface && !o.IsAbstract && o.IsClass && + typeof(ITransientDependency) != o && typeof(ITransientDependency).IsAssignableFrom(o))) { - options.Conventions.Add(new ApplicationConvention()); - options.Filters.Add(); - options.Filters.Add(); - }); + var interfaceType = type.GetInterfaces().FirstOrDefault(interfaceType => interfaceType.Name.EndsWith(type.Name)); - return services; + if (interfaceType != null) + services.TryAddTransient(interfaceType, type); + else + services.TryAddTransient(type, type); + + } } + /// /// 对称加密配置 ///