diff --git a/src/AspectCore.Extensions.Autofac/AspectCore.Extensions.Autofac.csproj b/src/AspectCore.Extensions.Autofac/AspectCore.Extensions.Autofac.csproj
index 53826f5f..fe50a318 100644
--- a/src/AspectCore.Extensions.Autofac/AspectCore.Extensions.Autofac.csproj
+++ b/src/AspectCore.Extensions.Autofac/AspectCore.Extensions.Autofac.csproj
@@ -21,7 +21,7 @@
-
+
diff --git a/src/AspectCore.Extensions.Autofac/AutofacServiceResolver.cs b/src/AspectCore.Extensions.Autofac/AutofacServiceResolver.cs
index 7dbddfff..453c8ad2 100644
--- a/src/AspectCore.Extensions.Autofac/AutofacServiceResolver.cs
+++ b/src/AspectCore.Extensions.Autofac/AutofacServiceResolver.cs
@@ -2,6 +2,8 @@
using AspectCore.DynamicProxy;
using AspectCore.DependencyInjection;
using Autofac;
+using Autofac.Core;
+using Autofac.Core.Lifetime;
namespace AspectCore.Extensions.Autofac
{
@@ -34,12 +36,20 @@ public object Resolve(Type serviceType)
#if NET8_0_OR_GREATER
public object GetKeyedService(Type serviceType, object serviceKey)
{
- throw new NotImplementedException();
+ if (serviceKey is null)
+ {
+ return _componentContext.ResolveOptional(serviceType);
+ }
+ return _componentContext.ResolveKeyed(serviceKey, serviceType);
}
public object GetRequiredKeyedService(Type serviceType, object serviceKey)
{
- throw new NotImplementedException();
+ if (serviceKey is null)
+ {
+ return _componentContext.Resolve(serviceType);
+ }
+ return _componentContext.ResolveKeyed(serviceKey, serviceType);
}
#endif
}
diff --git a/tests/AspectCore.Extensions.Autofac.Test/AspectCore.Extensions.Autofac.Test.csproj b/tests/AspectCore.Extensions.Autofac.Test/AspectCore.Extensions.Autofac.Test.csproj
index 57fb4bfa..d2e4a61e 100644
--- a/tests/AspectCore.Extensions.Autofac.Test/AspectCore.Extensions.Autofac.Test.csproj
+++ b/tests/AspectCore.Extensions.Autofac.Test/AspectCore.Extensions.Autofac.Test.csproj
@@ -18,26 +18,23 @@
-
-
+
-
-
+
-
-
+
all
diff --git a/tests/AspectCore.Extensions.Autofac.Test/KeyedServiceTests.cs b/tests/AspectCore.Extensions.Autofac.Test/KeyedServiceTests.cs
new file mode 100644
index 00000000..8d5da1f2
--- /dev/null
+++ b/tests/AspectCore.Extensions.Autofac.Test/KeyedServiceTests.cs
@@ -0,0 +1,73 @@
+using System.Threading.Tasks;
+using AspectCore.DependencyInjection;
+using AspectCore.DynamicProxy;
+using AspectCore.Extensions.Autofac;
+using AspectCore.Extensions.DependencyInjection;
+using Autofac;
+using Autofac.Extensions.DependencyInjection;
+using Microsoft.Extensions.DependencyInjection;
+using Xunit;
+
+namespace AspectCoreTest.Autofac;
+
+public class KeyedServiceTests
+{
+ public class InterceptKey : AbstractInterceptorAttribute
+ {
+ private int _key;
+
+ public InterceptKey(int key)
+ {
+ _key = key;
+ }
+
+ public override async Task Invoke(AspectContext context, AspectDelegate next)
+ {
+ await context.Invoke(next);
+ context.ReturnValue = _key;
+ }
+ }
+
+ public interface IKeydService
+ {
+ int Get();
+ int GetIntercept();
+ }
+
+ public class KeydService : IKeydService
+ {
+ private int _current = 0;
+ public int Get()
+ {
+ _current++;
+ return _current;
+ }
+
+ [InterceptKey(1000)]
+ public int GetIntercept()
+ {
+ return 2;
+ }
+ }
+#if NET8_0_OR_GREATER
+ [Fact]
+ public void GetKeydService_WithServiceProvider()
+ {
+ var services = new ServiceCollection();
+ var builder = new ContainerBuilder();
+ builder.RegisterDynamicProxy();
+ services.AddKeyedScoped("key1");
+ services.AddKeyedScoped("key2");
+ builder.Populate(services);
+ var serviceProvider = new AutofacServiceProvider(builder.Build());
+ var keydService = serviceProvider.GetKeyedService("key1");
+ Assert.Equal(1, keydService.Get());
+ Assert.Equal(1000, keydService.GetIntercept());
+
+ var keyd2Service = serviceProvider.GetKeyedService("key2");
+ //不同实例
+ Assert.Equal(1, keyd2Service.Get());
+ Assert.Equal(1000, keyd2Service.GetIntercept());
+ }
+#endif
+}
\ No newline at end of file