Skip to content

Commit

Permalink
😊 修复 依赖注入模块通过 INamedServiceProvider<> 解析服务没有应用拦截器问题
Browse files Browse the repository at this point in the history
  • Loading branch information
MonkSoul committed Aug 24, 2024
1 parent efc3404 commit 0277177
Show file tree
Hide file tree
Showing 8 changed files with 46 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
<ItemGroup>
<PackageReference Include="Ben.Demystifier" Version="0.4.1" />
<PackageReference Include="Microsoft.AspNetCore.Razor.Language" Version="6.0.33" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.10.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.11.0" />
<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
<ItemGroup>
<PackageReference Include="Ben.Demystifier" Version="0.4.1" />
<PackageReference Include="Microsoft.AspNetCore.Razor.Language" Version="6.0.33" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.10.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.11.0" />
<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,8 @@ private static void RegisterNamedService<TDependency>(IServiceCollection service
object ResolveService(string named, TDependency _)
{
var isRegister = TypeNamedCollection.TryGetValue(named, out var serviceType);

// 暂不支持 AOP
return isRegister ? provider.GetService(serviceType) : null;
}
return (Func<string, TDependency, object>)ResolveService;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
// 请访问 https://gitee.com/dotnetchina/Furion 获取更多关于 Furion 项目的许可证和版权信息。
// ------------------------------------------------------------------------

using Furion.Reflection;
using Microsoft.Extensions.DependencyInjection;
using System.Reflection;

Expand Down Expand Up @@ -56,10 +57,16 @@ public NamedServiceProvider(IServiceProvider serviceProvider)
/// <returns></returns>
public TService GetService(string serviceName)
{
// 解析所有实现
return _serviceProvider.GetServices<TService>()
.Where(u => ResovleServiceName(u.GetType()) == serviceName)
.FirstOrDefault();
var services = _serviceProvider.GetServices<TService>();

if (services
.OfType<AspectDispatchProxy>()
.FirstOrDefault(u => ResovleServiceName(((dynamic)u).Target.GetType()) == serviceName) is not TService service)
{
service = services.FirstOrDefault(u => ResovleServiceName(u.GetType()) == serviceName);
}

return service;
}

/// <summary>
Expand All @@ -83,9 +90,14 @@ public TService GetService<ILifetime>(string serviceName)
public TService GetRequiredService(string serviceName)
{
// 解析所有实现
var service = _serviceProvider.GetServices<TService>()
.Where(u => ResovleServiceName(u.GetType()) == serviceName)
.FirstOrDefault();
var services = _serviceProvider.GetServices<TService>();

if (services
.OfType<AspectDispatchProxy>()
.FirstOrDefault(u => ResovleServiceName(((dynamic)u).Target.GetType()) == serviceName) is not TService service)
{
service = services.FirstOrDefault(u => ResovleServiceName(u.GetType()) == serviceName);
}

// 如果服务不存在,抛出异常
return service ?? throw new InvalidOperationException($"Named service `{serviceName}` is not registered in container.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,8 @@ private static void RegisterNamedService<TDependency>(IServiceCollection service
object ResolveService(string named, TDependency _)
{
var isRegister = TypeNamedCollection.TryGetValue(named, out var serviceType);

// 暂不支持 AOP
return isRegister ? provider.GetService(serviceType) : null;
}
return (Func<string, TDependency, object>)ResolveService;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
// 请访问 https://gitee.com/dotnetchina/Furion 获取更多关于 Furion 项目的许可证和版权信息。
// ------------------------------------------------------------------------

using Furion.Reflection;
using Microsoft.Extensions.DependencyInjection;
using System.Reflection;

Expand Down Expand Up @@ -56,10 +57,16 @@ public NamedServiceProvider(IServiceProvider serviceProvider)
/// <returns></returns>
public TService GetService(string serviceName)
{
// 解析所有实现
return _serviceProvider.GetServices<TService>()
.Where(u => ResovleServiceName(u.GetType()) == serviceName)
.FirstOrDefault();
var services = _serviceProvider.GetServices<TService>();

if (services
.OfType<AspectDispatchProxy>()
.FirstOrDefault(u => ResovleServiceName(((dynamic)u).Target.GetType()) == serviceName) is not TService service)
{
service = services.FirstOrDefault(u => ResovleServiceName(u.GetType()) == serviceName);
}

return service;
}

/// <summary>
Expand All @@ -83,9 +90,14 @@ public TService GetService<ILifetime>(string serviceName)
public TService GetRequiredService(string serviceName)
{
// 解析所有实现
var service = _serviceProvider.GetServices<TService>()
.Where(u => ResovleServiceName(u.GetType()) == serviceName)
.FirstOrDefault();
var services = _serviceProvider.GetServices<TService>();

if (services
.OfType<AspectDispatchProxy>()
.FirstOrDefault(u => ResovleServiceName(((dynamic)u).Target.GetType()) == serviceName) is not TService service)
{
service = services.FirstOrDefault(u => ResovleServiceName(u.GetType()) == serviceName);
}

// 如果服务不存在,抛出异常
return service ?? throw new InvalidOperationException($"Named service `{serviceName}` is not registered in container.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.8" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.0" />
<PackageReference Include="System.Text.Json" Version="8.0.4" />
<PackageReference Include="xunit" Version="2.9.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2">
Expand Down
2 changes: 1 addition & 1 deletion tests/Furion.UnitTests/Furion.UnitTests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.0" />
<PackageReference Include="xunit" Version="2.9.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
Expand Down

0 comments on commit 0277177

Please sign in to comment.