Skip to content

Commit ed1f72d

Browse files
committed
refactor: Refactor isolation
1 parent 118b133 commit ed1f72d

File tree

60 files changed

+312
-285
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+312
-285
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,24 @@
11
// Copyright (c) MASA Stack All rights reserved.
22
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.
33

4-
[assembly: InternalsVisibleTo("Masa.Contrib.Caching.Distributed.StackExchangeRedis")]
5-
64
// ReSharper disable once CheckNamespace
75

86
namespace Masa.BuildingBlocks.Caching;
97

10-
internal static class DistributedCacheBuilderExtensions
8+
public static class DistributedCacheBuilderExtensions
119
{
12-
public static void AddDistributedCache(
10+
public static void UseCustomDistributedCache(
1311
this DistributedCacheBuilder distributedCacheBuilder,
1412
Func<IServiceProvider, IManualDistributedCacheClient> func)
1513
{
16-
distributedCacheBuilder.Services.Configure<TypeAliasFactoryOptions>(options => options.TryAdd(distributedCacheBuilder.Name));
17-
1814
distributedCacheBuilder.Services.Configure<DistributedCacheFactoryOptions>(options =>
1915
{
2016
if (options.Options.Any(opt => opt.Name == distributedCacheBuilder.Name))
2117
return;
2218

2319
options.Options.Add(new CacheRelationOptions<IManualDistributedCacheClient>(distributedCacheBuilder.Name, func));
2420
});
21+
22+
distributedCacheBuilder.Services.TryAddDistributedCache(distributedCacheBuilder.Name);
2523
}
2624
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Copyright (c) MASA Stack All rights reserved.
2+
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.
3+
4+
// ReSharper disable once CheckNamespace
5+
6+
namespace Masa.BuildingBlocks.Caching;
7+
8+
public static class MultilevelCacheBuilderExtensions
9+
{
10+
public static void UseCustomMultilevelCache(
11+
this MultilevelCacheBuilder multilevelCacheBuilder,
12+
Func<IServiceProvider, IManualMultilevelCacheClient> func)
13+
{
14+
multilevelCacheBuilder.Services.Configure<MultilevelCacheFactoryOptions>(options =>
15+
{
16+
if (options.Options.Any(opt => opt.Name == multilevelCacheBuilder.Name))
17+
return;
18+
19+
var cacheRelationOptions = new CacheRelationOptions<IManualMultilevelCacheClient>(multilevelCacheBuilder.Name, func.Invoke);
20+
options.Options.Add(cacheRelationOptions);
21+
});
22+
23+
multilevelCacheBuilder.Services.TryAddMultilevelCache(multilevelCacheBuilder.Name);
24+
}
25+
}

src/BuildingBlocks/Caching/Masa.BuildingBlocks.Caching/Extensions/ServiceCollectionExtensions.cs

-3
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,11 @@ public static IServiceCollection AddDistributedCache(
1919
Action<DistributedCacheBuilder> action,
2020
Action<TypeAliasOptions>? typeAliasOptionsAction = null)
2121
{
22-
services.TryAddDistributedCache();
2322
DistributedCacheBuilder distributedCacheBuilder = new(services, name);
2423
action.Invoke(distributedCacheBuilder);
2524

2625
if (typeAliasOptionsAction != null)
2726
services.Configure(name, typeAliasOptionsAction);
28-
29-
services.TryAddSingleton<IFormatCacheKeyProvider, DefaultFormatCacheKeyProvider>();
3027
return services;
3128
}
3229
}

src/BuildingBlocks/Caching/Masa.BuildingBlocks.Caching/Internal/ServiceCollectionExtensions.Core.cs

+13-15
Original file line numberDiff line numberDiff line change
@@ -12,43 +12,41 @@ namespace Masa.BuildingBlocks.Caching;
1212
/// </summary>
1313
internal static class ServiceCollectionExtensions
1414
{
15-
public static void TryAddDistributedCache(this IServiceCollection services)
15+
public static void TryAddDistributedCache(
16+
this IServiceCollection services,
17+
string name)
1618
{
1719
MasaApp.TrySetServiceCollection(services);
18-
services.AddServiceFactory();
1920

2021
services.TryAddTransient<IDistributedCacheClientFactory, DefaultDistributedCacheClientFactory>();
2122
services.TryAddSingleton(serviceProvider
2223
=> serviceProvider.GetRequiredService<IDistributedCacheClientFactory>().Create());
2324
services.TryAddSingleton(typeof(IDistributedCacheClient), serviceProvider
2425
=> serviceProvider.GetRequiredService<IManualDistributedCacheClient>());
2526

26-
services.TryAddSingleton<ITypeAliasFactory, DefaultTypeAliasFactory>();
27+
services.AddTypeAlias(name);
2728
}
2829

2930
public static void TryAddMultilevelCache(
3031
this IServiceCollection services,
31-
string name,
32-
Func<IServiceProvider, IManualMultilevelCacheClient> func)
32+
string name)
3333
{
34-
services.Configure<MultilevelCacheFactoryOptions>(options =>
35-
{
36-
if (options.Options.Any(opt => opt.Name == name))
37-
return;
38-
39-
var cacheRelationOptions = new CacheRelationOptions<IManualMultilevelCacheClient>(name, func.Invoke);
40-
options.Options.Add(cacheRelationOptions);
41-
});
34+
MasaApp.TrySetServiceCollection(services);
4235

4336
services.TryAddTransient<IMultilevelCacheClientFactory, DefaultMultilevelCacheClientFactory>();
4437
services.TryAddSingleton(serviceProvider
4538
=> serviceProvider.GetRequiredService<IMultilevelCacheClientFactory>().Create());
4639
services.TryAddSingleton(typeof(IMultilevelCacheClient), serviceProvider
4740
=> serviceProvider.GetRequiredService<IManualMultilevelCacheClient>());
4841

42+
services.AddTypeAlias(name);
43+
}
44+
45+
private static void AddTypeAlias(
46+
this IServiceCollection services,
47+
string name)
48+
{
4949
services.TryAddSingleton<ITypeAliasFactory, DefaultTypeAliasFactory>();
5050
services.Configure<TypeAliasFactoryOptions>(options => options.TryAdd(name));
51-
52-
services.TryAddDistributedCache();
5351
}
5452
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Copyright (c) MASA Stack All rights reserved.
2+
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.
3+
4+
namespace Masa.BuildingBlocks.Caching;
5+
6+
public class MultilevelCacheBuilder
7+
{
8+
public IServiceCollection Services { get; }
9+
10+
/// <summary>
11+
/// Gets the name of the client configured by this builder.
12+
/// </summary>
13+
public string Name { get; }
14+
15+
public MultilevelCacheBuilder(IServiceCollection services, string name)
16+
{
17+
Services = services;
18+
Name = name;
19+
}
20+
}

src/BuildingBlocks/Data/Masa.BuildingBlocks.Data.Contracts/Internal/ScopedService.cs

-17
This file was deleted.

src/BuildingBlocks/Data/Masa.BuildingBlocks.Data.Contracts/Internal/SingletonService.cs

-16
This file was deleted.

src/BuildingBlocks/Data/Masa.BuildingBlocks.Data/IdGenerator/Extensions/ServiceCollectionExtensions.cs

-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ public static partial class ServiceCollectionExtensions
88
{
99
public static IServiceCollection AddIdGeneratorCore(this IServiceCollection services)
1010
{
11-
services.AddServiceFactory();
1211
services.AddSingleton<IIdGeneratorFactory, DefaultIdGeneratorFactory>();
1312
return services;
1413
}

src/BuildingBlocks/Data/Masa.BuildingBlocks.Data/Serialization/Extensions/ServiceCollectionExtensions.cs

-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ private static IServiceCollection AddSerializationCore(this IServiceCollection s
2929
services.TryAddSingleton<ISerializerFactory, DefaultSerializerFactory>();
3030
services.TryAddSingleton(serviceProvider => serviceProvider.GetRequiredService<ISerializerFactory>().Create());
3131
services.TryAddSingleton(serviceProvider => serviceProvider.GetRequiredService<IDeserializerFactory>().Create());
32-
services.AddServiceFactory();
3332
return services;
3433
}
3534
}
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,16 @@
11
// Copyright (c) MASA Stack All rights reserved.
22
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.
33

4-
[assembly: InternalsVisibleTo("Masa.BuildingBlocks.Caching")]
54
[assembly: InternalsVisibleTo("Masa.BuildingBlocks.RulesEngine")]
6-
[assembly: InternalsVisibleTo("Masa.BuildingBlocks.SearchEngine.AutoComplete")]
7-
[assembly: InternalsVisibleTo("Masa.BuildingBlocks.Service.Caller")]
85
[assembly: InternalsVisibleTo("Masa.BuildingBlocks.Storage.ObjectStorage")]
6+
[assembly: InternalsVisibleTo("Masa.BuildingBlocks.SearchEngine.AutoComplete")]
97

108
// ReSharper disable once CheckNamespace
119

12-
namespace Masa.BuildingBlocks.Data;
10+
namespace Masa.BuildingBlocks.Isolation;
1311

14-
internal static class ServiceCollectionExtensions
12+
internal static class ServiceProviderExtensions
1513
{
16-
public static void AddServiceFactory(this IServiceCollection services)
17-
{
18-
services.TryAddSingleton<SingletonService>();
19-
services.TryAddScoped<ScopedService>();
20-
}
14+
public static bool EnableIsolation(this IServiceProvider serviceProvider)
15+
=> serviceProvider.GetService<IOptions<IsolationOptions>>()?.Value.Enable ?? false;
2116
}

src/BuildingBlocks/RulesEngine/Masa.BuildingBlocks.RulesEngine/Internal/RulesEngineOptionsBuilderExtensions.cs src/BuildingBlocks/RulesEngine/Masa.BuildingBlocks.RulesEngine/Extensions/RulesEngineOptionsBuilderExtensions.cs

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
// Copyright (c) MASA Stack All rights reserved.
22
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.
33

4-
[assembly: InternalsVisibleTo("Masa.Contrib.RulesEngine.MicrosoftRulesEngine")]
5-
64
// ReSharper disable once CheckNamespace
75

86
namespace Masa.BuildingBlocks.RulesEngine;
97

10-
internal static class RulesEngineOptionsBuilderExtensions
8+
public static class RulesEngineOptionsBuilderExtensions
119
{
12-
public static void AddRulesEngine(
10+
public static void UseCustomRulesEngine(
1311
this RulesEngineOptionsBuilder rulesEngineOptionsBuilder,
1412
Func<IServiceProvider, IRulesEngineClient> func)
1513
{

src/BuildingBlocks/RulesEngine/Masa.BuildingBlocks.RulesEngine/Extensions/ServiceCollectionExtensions.cs

+13-2
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,21 @@ public static IServiceCollection AddRulesEngine(this IServiceCollection services
1414
{
1515
MasaApp.TrySetServiceCollection(services);
1616
services.TryAddTransient<IRulesEngineFactory, DefaultRulesEngineFactory>();
17-
services.TryAddSingleton(serviceProvider => serviceProvider.GetRequiredService<IRulesEngineFactory>().Create());
17+
18+
services.TryAddSingleton<SingletonRulesEngine>(serviceProvider
19+
=> new SingletonRulesEngine(serviceProvider.GetRequiredService<IRulesEngineFactory>().Create()));
20+
services.TryAddScoped<ScopedRulesEngine>(serviceProvider
21+
=> new ScopedRulesEngine(serviceProvider.GetRequiredService<IRulesEngineFactory>().Create()));
22+
23+
services.TryAddTransient(serviceProvider =>
24+
{
25+
if (serviceProvider.EnableIsolation())
26+
return serviceProvider.GetRequiredService<ScopedRulesEngine>().RulesEngineClient;
27+
28+
return serviceProvider.GetRequiredService<SingletonRulesEngine>().RulesEngineClient;
29+
});
1830
var rulesEngineOptionsBuilder = new RulesEngineOptionsBuilder(services, name);
1931
action.Invoke(rulesEngineOptionsBuilder);
20-
services.AddServiceFactory();
2132
return services;
2233
}
2334
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Copyright (c) MASA Stack All rights reserved.
2+
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.
3+
4+
// ReSharper disable once CheckNamespace
5+
6+
namespace Masa.BuildingBlocks.RulesEngine;
7+
8+
internal class ScopedRulesEngine
9+
{
10+
public IRulesEngineClient RulesEngineClient { get; }
11+
12+
public ScopedRulesEngine(IRulesEngineClient rulesEngineClient)
13+
{
14+
RulesEngineClient = rulesEngineClient;
15+
}
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Copyright (c) MASA Stack All rights reserved.
2+
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.
3+
4+
// ReSharper disable once CheckNamespace
5+
6+
namespace Masa.BuildingBlocks.RulesEngine;
7+
8+
internal class SingletonRulesEngine
9+
{
10+
public IRulesEngineClient RulesEngineClient { get; }
11+
12+
public SingletonRulesEngine(IRulesEngineClient rulesEngineClient)
13+
{
14+
RulesEngineClient = rulesEngineClient;
15+
}
16+
}

src/BuildingBlocks/SearchEngine/Masa.BuildingBlocks.SearchEngine.AutoComplete/AutoCompleteClientBase.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace Masa.BuildingBlocks.SearchEngine.AutoComplete;
55

6-
public abstract class AutoCompleteClientBase : IManualAutoCompleteClient
6+
public abstract class AutoCompleteClientBase : IAutoCompleteClient, IDisposable
77
{
88
public abstract Task<bool> BuildAsync(CancellationToken cancellationToken = default);
99

src/BuildingBlocks/SearchEngine/Masa.BuildingBlocks.SearchEngine.AutoComplete/DefaultAutoCompleteFactory.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55

66
namespace Masa.BuildingBlocks.SearchEngine.AutoComplete;
77

8-
public class DefaultAutoCompleteFactory : MasaFactoryBase<IManualAutoCompleteClient, AutoCompleteRelationsOptions>, IAutoCompleteFactory
8+
public class DefaultAutoCompleteFactory : MasaFactoryBase<IAutoCompleteClient, MasaRelationOptions<IAutoCompleteClient>>, IAutoCompleteFactory
99
{
1010
protected override string DefaultServiceNotFoundMessage => "No default AutoComplete found";
1111
protected override string SpecifyServiceNotFoundMessage => "Please make sure you have used [{0}] AutoComplete, it was not found";
12-
protected override MasaFactoryOptions<AutoCompleteRelationsOptions> FactoryOptions => _options.CurrentValue;
12+
protected override MasaFactoryOptions<MasaRelationOptions<IAutoCompleteClient>> FactoryOptions => _options.CurrentValue;
1313

1414
private readonly IOptionsMonitor<AutoCompleteFactoryOptions> _options;
1515

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Copyright (c) MASA Stack All rights reserved.
2+
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.
3+
4+
// ReSharper disable once CheckNamespace
5+
6+
namespace Microsoft.Extensions.DependencyInjection;
7+
8+
public static class AutoCompleteOptionsBuilderExtensions
9+
{
10+
public static void UseCustomAutoComplete(
11+
this AutoCompleteOptionsBuilder autoCompleteOptionsBuilder,
12+
Func<IServiceProvider, IAutoCompleteClient> implementationFactory)
13+
{
14+
MasaArgumentException.ThrowIfNull(implementationFactory);
15+
16+
autoCompleteOptionsBuilder.Services.Configure<AutoCompleteFactoryOptions>(factoryOptions =>
17+
{
18+
if (factoryOptions.Options.Any(relation => relation.Name == autoCompleteOptionsBuilder.Name))
19+
throw new ArgumentException(
20+
$"The {nameof(IAutoCompleteClient)} name already exists, please change the name, the repeat name is [{autoCompleteOptionsBuilder.Name}]");
21+
22+
factoryOptions.Options.Add(new MasaRelationOptions<IAutoCompleteClient>(autoCompleteOptionsBuilder.Name, implementationFactory));
23+
});
24+
}
25+
}

src/BuildingBlocks/SearchEngine/Masa.BuildingBlocks.SearchEngine.AutoComplete/Extensions/ServiceCollectionExtensions.cs

+17-2
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,24 @@ public static IServiceCollection AddAutoCompleteBySpecifyDocument<TDocument>(
4242
where TDocument : AutoCompleteDocument
4343
{
4444
MasaArgumentException.ThrowIfNull(configure);
45+
46+
services.TryAddTransient<IAutoCompleteFactory, DefaultAutoCompleteFactory>();
47+
services.TryAddSingleton<SingletonAutoCompleteClient>(serviceProvider
48+
=> new SingletonAutoCompleteClient(serviceProvider.GetRequiredService<IAutoCompleteFactory>().Create()));
49+
services.TryAddScoped<ScopedAutoCompleteClient>(serviceProvider
50+
=> new ScopedAutoCompleteClient(serviceProvider.GetRequiredService<IAutoCompleteFactory>().Create()));
51+
52+
services.TryAddTransient(serviceProvider =>
53+
{
54+
if (serviceProvider.EnableIsolation())
55+
return serviceProvider.GetRequiredService<ScopedAutoCompleteClient>().AutoCompleteClient;
56+
57+
return serviceProvider.GetRequiredService<SingletonAutoCompleteClient>().AutoCompleteClient;
58+
});
59+
60+
MasaApp.TrySetServiceCollection(services);
61+
4562
configure.Invoke(new AutoCompleteOptionsBuilder(services, name, typeof(TDocument)));
4663
return services;
4764
}
48-
49-
5065
}

src/BuildingBlocks/SearchEngine/Masa.BuildingBlocks.SearchEngine.AutoComplete/IAutoCompleteFactory.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace Masa.BuildingBlocks.SearchEngine.AutoComplete;
55

6-
public interface IAutoCompleteFactory : IMasaFactory<IManualAutoCompleteClient>
6+
public interface IAutoCompleteFactory : IMasaFactory<IAutoCompleteClient>
77
{
88
[Obsolete("Use Create() instead")]
99
IAutoCompleteClient CreateClient();

src/BuildingBlocks/SearchEngine/Masa.BuildingBlocks.SearchEngine.AutoComplete/IManualAutoCompleteClient.cs

-9
This file was deleted.

0 commit comments

Comments
 (0)