Skip to content

Commit a8f454d

Browse files
committed
feat: better control of autofac instances scope and sharing
1 parent 1bf5764 commit a8f454d

3 files changed

Lines changed: 16 additions & 21 deletions

File tree

SharpRepository.Ioc.Autofac/AutofacExtensions.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ public static class AutofacExtensions
1818
/// <param name="configuration"></param>
1919
/// <param name="repositoryName"></param>
2020
/// <param name="lifetimeScopeTag">Accepts any MatchingScopeLifetimeTags scope enum tag</param>
21-
public static void RegisterSharpRepository(this ContainerBuilder containerBuilder, ISharpRepositoryConfiguration configuration, string repositoryName = null, params object[] lifetimeScopeTag)
21+
public static void RegisterSharpRepository(this ContainerBuilder containerBuilder, ISharpRepositoryConfiguration configuration, string repositoryName = null, IComponentLifetime lifetime = null, InstanceSharing instanceSharing = InstanceSharing.None)
2222
{
23-
containerBuilder.RegisterSource(new RepositoryRegistrationSource(configuration, repositoryName, lifetimeScopeTag));
23+
containerBuilder.RegisterSource(new RepositoryRegistrationSource(configuration, repositoryName, lifetime, instanceSharing));
2424
}
2525

2626
/// <summary>
@@ -30,14 +30,14 @@ public static void RegisterSharpRepository(this ContainerBuilder containerBuilde
3030
/// <param name="configuration"></param>
3131
/// <param name="repositoryName"></param>
3232
/// <param name="lifetimeScopeTag">Accepts any MatchingScopeLifetimeTags scope enum tag</param>
33-
public static void RegisterSharpRepository(this ContainerBuilder containerBuilder, IConfigurationSection configurationSection, string repositoryName = null, params object[] lifetimeScopeTag)
33+
public static void RegisterSharpRepository(this ContainerBuilder containerBuilder, IConfigurationSection configurationSection, string repositoryName = null, IComponentLifetime lifetime = null, InstanceSharing instanceSharing = InstanceSharing.None)
3434
{
3535
if (configurationSection == null)
3636
throw new ConfigurationErrorsException("Configuration section not found.");
3737

3838
var configuration = RepositoryFactory.BuildSharpRepositoryConfiguation(configurationSection);
3939

40-
containerBuilder.RegisterSharpRepository(configuration, repositoryName, lifetimeScopeTag);
40+
containerBuilder.RegisterSharpRepository(configuration, repositoryName, lifetime, instanceSharing);
4141
}
4242
}
4343
}

SharpRepository.Ioc.Autofac/RepositoryRegistrationSource.cs

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,17 @@ namespace SharpRepository.Ioc.Autofac
1616
class RepositoryRegistrationSource : IRegistrationSource
1717
{
1818
protected ISharpRepositoryConfiguration Configuration;
19-
protected object[] LifetimeScopeTag;
19+
protected IComponentLifetime Lifetime;
20+
InstanceSharing InstanceSharing;
21+
2022
protected string RepositoryName;
2123

22-
public RepositoryRegistrationSource(ISharpRepositoryConfiguration configuration, string repositoryName = null, params object[] lifetimeScopeTag)
24+
public RepositoryRegistrationSource(ISharpRepositoryConfiguration configuration, string repositoryName = null, IComponentLifetime lifetime = null, InstanceSharing instanceSharing = InstanceSharing.None)
2325
{
2426
Configuration = configuration;
2527
RepositoryName = repositoryName;
26-
LifetimeScopeTag = lifetimeScopeTag;
28+
Lifetime = lifetime ?? new CurrentScopeLifetime();
29+
InstanceSharing = instanceSharing;
2730
}
2831

2932
public bool IsAdapterForIndividualComponents => true;
@@ -44,16 +47,6 @@ public IEnumerable<IComponentRegistration> RegistrationsFor(Service service, Fun
4447
return Enumerable.Empty<IComponentRegistration>();
4548
}
4649

47-
IComponentLifetime lifetime;
48-
var instanceSharing = InstanceSharing.None;
49-
if (LifetimeScopeTag != null && LifetimeScopeTag.Count() > 0)
50-
{
51-
lifetime = new MatchingScopeLifetime(LifetimeScopeTag);
52-
instanceSharing = InstanceSharing.Shared;
53-
}
54-
else
55-
lifetime = new CurrentScopeLifetime();
56-
5750
var registration = new ComponentRegistration(
5851
Guid.NewGuid(),
5952
new DelegateActivator(swt.ServiceType, (c, p) =>
@@ -88,8 +81,8 @@ public IEnumerable<IComponentRegistration> RegistrationsFor(Service service, Fun
8881
else
8982
throw new NotImplementedException("Error resolving repository: " + swt.ServiceType.Name);
9083
}),
91-
lifetime,
92-
instanceSharing,
84+
Lifetime,
85+
InstanceSharing,
9386
InstanceOwnership.OwnedByLifetimeScope,
9487
new[] { service },
9588
new Dictionary<string, object>()

SharpRepository.Samples.Net6Mvc/Program.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Autofac;
2+
using Autofac.Core;
23
using Autofac.Core.Lifetime;
34
using Autofac.Extensions.DependencyInjection;
45
using Microsoft.EntityFrameworkCore;
@@ -17,7 +18,7 @@
1718
// reads configuratio from appsettings.json
1819
var sharpRepoConfig = builder.Configuration.GetSection("sharpRepository");
1920

20-
b.RegisterSharpRepository(sharpRepoConfig, null, MatchingScopeLifetimeTags.RequestLifetimeScopeTag); //default InMemory
21+
b.RegisterSharpRepository(sharpRepoConfig, null, new RootScopeLifetime(), InstanceSharing.Shared); //default InMemory, instances must be treaded as singletons to work
2122
// b.RegisterSharpRepository(sharpRepoConfig, "mongoDb"); // for Mongo Db
2223
// b.RegisterSharpRepository(sharpRepoConfig, "efCore");// for Ef Core
2324
});
@@ -30,7 +31,8 @@
3031

3132
// services.AddTransient<DbContext, ContactContext>(); // needed if you don't write dbContextClass on json configuration
3233

33-
builder.Services.AddTransient<EmailRepository>(r => new EmailRepository(RepositoryFactory.BuildSharpRepositoryConfiguation(builder.Configuration.GetSection("sharpRepository")), "efCore"));
34+
//builder.Services.AddTransient<EmailRepository>(r => new EmailRepository(RepositoryFactory.BuildSharpRepositoryConfiguation(builder.Configuration.GetSection("sharpRepository")), "efCore"));
35+
builder.Services.AddSingleton<EmailRepository>(r => new EmailRepository(RepositoryFactory.BuildSharpRepositoryConfiguation(builder.Configuration.GetSection("sharpRepository")), "inMemory")); // will not work as expected it doesn't share same memory repository
3436

3537

3638
var app = builder.Build();

0 commit comments

Comments
 (0)