Skip to content

Commit 3be68c0

Browse files
Add non-lazy registration mutator supporting.
1 parent fd8e164 commit 3be68c0

File tree

4 files changed

+87
-3
lines changed

4 files changed

+87
-3
lines changed

LazyProxy.Autofac.Tests/AutofacExtensionTests.cs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
using System.Linq;
55
using System.Runtime.CompilerServices;
66
using Autofac;
7+
using Autofac.Builder;
78
using Autofac.Core;
9+
using Autofac.Extras.DynamicProxy;
10+
using Castle.DynamicProxy;
811
using Xunit;
912

1013
[assembly: InternalsVisibleTo("LazyProxy.DynamicTypes")]
@@ -350,6 +353,36 @@ public void OpenGenericServiceMustBeResolved(string name)
350353
}
351354
}
352355

356+
[Theory]
357+
[InlineData(null)]
358+
[InlineData("name")]
359+
public void NonLazyRegistrationMutatorMustBeApplied(string name)
360+
{
361+
const string arg1 = nameof(arg1);
362+
const string arg2 = nameof(arg2);
363+
364+
var containerBuilder = new ContainerBuilder();
365+
var mutator = new FooMutator();
366+
367+
containerBuilder.RegisterType<FooInterceptor>().AsSelf();
368+
containerBuilder.RegisterLazy(typeof(IService1), typeof(Service1), name, mutator);
369+
containerBuilder.RegisterType<Service2>().As<IService2>();
370+
371+
using (var container = containerBuilder.Build())
372+
{
373+
var service = name == null
374+
? container.Resolve<IService1>()
375+
: container.ResolveNamed<IService1>(name);
376+
377+
var result = service.Method(s => s.Method(arg1), arg2);
378+
379+
Assert.Equal(
380+
$"{Service1MethodValue}{Service2MethodValue}{arg1}{arg2}" +
381+
$"{FooInterceptor.InterceptionSuffix}",
382+
result);
383+
}
384+
}
385+
353386
#region Lifetime tests
354387

355388
[Theory]
@@ -557,6 +590,29 @@ private static void AssertAllInstancesAreDifferent(params Guid[] keys) =>
557590

558591
#endregion
559592

593+
#region Private members for mutator testing
594+
595+
private class FooMutator : IRegistrationMutator
596+
{
597+
public IRegistrationBuilder<TLimit, TActivatorData, TRegistrationStyle>
598+
Mutate<TLimit, TActivatorData, TRegistrationStyle>(
599+
IRegistrationBuilder<TLimit, TActivatorData, TRegistrationStyle> registration) =>
600+
registration.EnableInterfaceInterceptors().InterceptedBy(typeof(FooInterceptor));
601+
}
602+
603+
private class FooInterceptor : IInterceptor
604+
{
605+
public const string InterceptionSuffix = "Intercepted";
606+
607+
public void Intercept(IInvocation invocation)
608+
{
609+
invocation.Proceed();
610+
invocation.ReturnValue = (string) invocation.ReturnValue + InterceptionSuffix;
611+
}
612+
}
613+
614+
#endregion
615+
560616
#region Test classes
561617

562618
public interface IHasId

LazyProxy.Autofac.Tests/LazyProxy.Autofac.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
</PropertyGroup>
77

88
<ItemGroup>
9+
<PackageReference Include="Autofac.Extras.DynamicProxy" Version="4.5.0" />
910
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.6.0" />
1011
<PackageReference Include="Moq" Version="4.9.0" />
1112
<PackageReference Include="xunit" Version="2.3.1" />

LazyProxy.Autofac/AutofacExtensions.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,11 @@ public static IRegistrationBuilder<object, SimpleActivatorData, SingleRegistrati
5959
/// <param name="typeTo">The linked class.</param>
6060
/// <param name="builder">The instance of the Autofac container builder.</param>
6161
/// <param name="name">The registration name. Null if named registration is not required.</param>
62+
/// <param name="nonLazyRegistrationMutator">A mutator allowing to change the non-lazy registration.</param>
6263
/// <returns>The instance of the Autofac registration builder.</returns>
6364
public static IRegistrationBuilder<object, SimpleActivatorData, SingleRegistrationStyle>
64-
RegisterLazy(this ContainerBuilder builder, Type typeFrom, Type typeTo, string name)
65+
RegisterLazy(this ContainerBuilder builder, Type typeFrom, Type typeTo, string name,
66+
IRegistrationMutator nonLazyRegistrationMutator = null)
6567
{
6668
// There is no way to constraint it on the compilation step.
6769
if (!typeFrom.IsInterface)
@@ -75,11 +77,13 @@ public static IRegistrationBuilder<object, SimpleActivatorData, SingleRegistrati
7577

7678
if (typeTo.IsGenericTypeDefinition)
7779
{
78-
builder.RegisterGeneric(typeTo).Named(registrationName, typeFrom);
80+
var nonLazyRegistration = builder.RegisterGeneric(typeTo).Named(registrationName, typeFrom);
81+
nonLazyRegistrationMutator?.Mutate(nonLazyRegistration);
7982
}
8083
else
8184
{
82-
builder.RegisterType(typeTo).Named(registrationName, typeFrom);
85+
var nonLazyRegistration = builder.RegisterType(typeTo).Named(registrationName, typeFrom);
86+
nonLazyRegistrationMutator?.Mutate(nonLazyRegistration);
8387
}
8488

8589
var registration = builder.Register((c, p) =>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using Autofac.Builder;
2+
3+
namespace LazyProxy.Autofac
4+
{
5+
/// <summary>
6+
/// A mutator allowing to change a registration.
7+
/// </summary>
8+
public interface IRegistrationMutator
9+
{
10+
/// <summary>
11+
/// Changes or adjusts the registration status.
12+
/// </summary>
13+
/// <param name="registration">A container registration.</param>
14+
/// <typeparam name="TLimit">The most specific type to which instances of the registration
15+
/// can be cast.</typeparam>
16+
/// <typeparam name="TActivatorData">Activator builder type.</typeparam>
17+
/// <typeparam name="TRegistrationStyle">Registration style type.</typeparam>
18+
/// <returns></returns>
19+
IRegistrationBuilder<TLimit, TActivatorData, TRegistrationStyle>
20+
Mutate<TLimit, TActivatorData, TRegistrationStyle>(
21+
IRegistrationBuilder<TLimit, TActivatorData, TRegistrationStyle> registration);
22+
}
23+
}

0 commit comments

Comments
 (0)