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. 2
      Gear/Gear/Abstractions/Use.cs
  6. 7
      Gear/Gear/Infrastructure/Extensions/FreeSqlManager.cs
  7. 114
      Gear/Gear/Infrastructure/Extensions/ServiceCollectionServiceExtensions.cs

7
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<ITestUse>();
public IEnumerable<WeatherForecast> Get()
{
@ -30,5 +31,9 @@ namespace Gear.Test.Api.Controllers
})
.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>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<PackageId>Gear</PackageId>
<Version>0.1.7</Version>
<Version>0.1.8</Version>
<Product>Gear</Product>
<AssemblyName>Gear</AssemblyName>
</PropertyGroup>

2
Gear/Gear/Abstractions/Use.cs

@ -13,7 +13,7 @@ namespace Gear.Abstractions
/// <summary>
/// 用例
/// </summary>
public abstract class Use
public abstract class Use
{
protected Use() { }

7
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;
}
}
}

114
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
{
/// <summary>
/// 齿轮配置 Gear.Abstractions 中的默认功能
/// </summary>
@ -42,62 +43,103 @@ namespace Gear.Infrastructure.Extensions
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)
{
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<ILazyServiceProvider>();
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<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());
options.Filters.Add<DefaultApiResponseFilter>();
options.Filters.Add<RunParameterActionFilter>();
});
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);
}
}
/// <summary>
/// 对称加密配置
/// </summary>

Loading…
Cancel
Save