Browse Source

修复 Use 无法依赖注入问题

修复 FreeSql 没有字符串链接的时候异常问题
增加了部分测试
master
Nice 3 years ago
parent
commit
c88608679a
  1. 7
      Gear.Test.Api/Controllers/WeatherForecastController.cs
  2. 13
      Gear.Test.Api/Uses/ITestUse.cs
  3. 16
      Gear.Test.Api/Uses/TestUse.cs
  4. 2
      Gear/Gear.csproj
  5. 7
      Gear/Gear/Infrastructure/Extensions/FreeSqlManager.cs
  6. 112
      Gear/Gear/Infrastructure/Extensions/ServiceCollectionServiceExtensions.cs

7
Gear.Test.Api/Controllers/WeatherForecastController.cs

@ -1,4 +1,5 @@
using Gear.Abstractions; using Gear.Abstractions;
using Gear.Test.Api.Uses;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using System; using System;
@ -15,7 +16,7 @@ namespace Gear.Test.Api.Controllers
{ {
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
}; };
private ITestUse TestUse => LazyServiceProvider.LazyGetService<ITestUse>();
public IEnumerable<WeatherForecast> Get() public IEnumerable<WeatherForecast> Get()
{ {
@ -30,5 +31,9 @@ namespace Gear.Test.Api.Controllers
}) })
.ToArray(); .ToArray();
} }
public string GetUse()
{
return TestUse.HelloUse();
}
} }
} }

13
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();
}
}

16
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!";
}
}
}

2
Gear/Gear.csproj

@ -8,7 +8,7 @@
<Company>全网科技</Company> <Company>全网科技</Company>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<PackageId>Gear</PackageId> <PackageId>Gear</PackageId>
<Version>0.1.7</Version> <Version>0.1.8</Version>
<Product>Gear</Product> <Product>Gear</Product>
<AssemblyName>Gear</AssemblyName> <AssemblyName>Gear</AssemblyName>
</PropertyGroup> </PropertyGroup>

7
Gear/Gear/Infrastructure/Extensions/FreeSqlManager.cs

@ -32,7 +32,12 @@ namespace Gear.Infrastructure.Extensions
} }
public static IFreeSql GetFreeSql(string configurationKey = "ConnectionString") public static IFreeSql GetFreeSql(string configurationKey = "ConnectionString")
{ {
return ib.Get(configurationKey); if (ib.GetKeys().Any(o => o == configurationKey))
{
return ib.Get(configurationKey);
}
return null;
} }
} }
} }

112
Gear/Gear/Infrastructure/Extensions/ServiceCollectionServiceExtensions.cs

@ -16,6 +16,7 @@ using Serilog;
using Serilog.Events; using Serilog.Events;
using Serilog.Sinks.Grafana.Loki; using Serilog.Sinks.Grafana.Loki;
using System; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Runtime.Loader; using System.Runtime.Loader;
@ -42,62 +43,103 @@ namespace Gear.Infrastructure.Extensions
assemblies.Add(typeof(ServiceCollectionServiceExtensions).Assembly); assemblies.Add(typeof(ServiceCollectionServiceExtensions).Assembly);
} }
services.AddLocalServiceLifetime(assemblies);
services.AddHttpContextAccessor();
services.AddAutoMapper(assemblies);
services.Configure<MvcOptions>(options =>
{
options.Conventions.Add(new ApplicationConvention());
options.Filters.Add<DefaultApiResponseFilter>();
options.Filters.Add<RunParameterActionFilter>();
});
return services;
}
private static void AddLocalServiceLifetime(this IServiceCollection services, List<Assembly> assemblies)
{
foreach (var assembly in assemblies) foreach (var assembly in assemblies)
{ {
var types = assembly.GetTypes(); var types = assembly.GetTypes();
foreach (var type in types.Where(o => !o.IsInterface && !o.IsAbstract && o.IsClass && services.AddUses(types);
typeof(ITransientDependency) != o && typeof(ITransientDependency).IsAssignableFrom(o)))
{
var interfaceType = type.GetInterfaces().FirstOrDefault(interfaceType => interfaceType.Name.EndsWith(type.Name));
if (interfaceType != null) services.AddTransientDependency(types);
services.TryAddTransient(interfaceType, type);
else
services.TryAddTransient(type, type);
} services.AddSingletonDependency(types);
foreach (var type in types.Where(o => !o.IsInterface && !o.IsAbstract && o.IsClass && services.AddScopedDependency(types);
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);
} 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 && services.TryAddTransient(type, type);
typeof(IScopedDependency) != o && typeof(IScopedDependency).IsAssignableFrom(o))) 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<ILazyServiceProvider>();
return use;
});
}
}
if (interfaceType != null) private static void AddScopedDependency(this IServiceCollection services, Type[] types)
services.TryAddScoped(interfaceType, type); {
else foreach (var type in types.Where(o => !o.IsInterface && !o.IsAbstract && o.IsClass &&
services.TryAddScoped(type, type); 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<MvcOptions>(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()); var interfaceType = type.GetInterfaces().FirstOrDefault(interfaceType => interfaceType.Name.EndsWith(type.Name));
options.Filters.Add<DefaultApiResponseFilter>();
options.Filters.Add<RunParameterActionFilter>();
});
return services; if (interfaceType != null)
services.TryAddTransient(interfaceType, type);
else
services.TryAddTransient(type, type);
}
} }
/// <summary> /// <summary>
/// 对称加密配置 /// 对称加密配置
/// </summary> /// </summary>

Loading…
Cancel
Save