Skip to content

Commit 9691011

Browse files
authored
Merge pull request #52 from cnblogs/add-service-collection-extension
Add a parameterless AddEnyimMemcached method
2 parents 1f4d123 + e127633 commit 9691011

File tree

11 files changed

+110
-95
lines changed

11 files changed

+110
-95
lines changed

Enyim.Caching.Tests/Enyim.Caching.Tests.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
</PropertyGroup>
66
<ItemGroup>
77
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.0.0" />
8-
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.0" />
9-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
8+
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.2" />
9+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.7.2" />
1010
<PackageReference Include="xunit" Version="2.3.1" />
1111
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
1212
</ItemGroup>

Enyim.Caching.Tests/MemcachedClientTestsBase.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Enyim.Caching.Memcached;
88
using Xunit;
99
using Microsoft.Extensions.DependencyInjection;
10+
using Microsoft.Extensions.Configuration;
1011

1112
namespace Enyim.Caching.Tests
1213
{
@@ -17,6 +18,8 @@ public abstract class MemcachedClientTestsBase
1718
public MemcachedClientTestsBase()
1819
{
1920
IServiceCollection services = new ServiceCollection();
21+
var configuration = new ConfigurationBuilder().Build();
22+
services.AddSingleton<IConfiguration>(configuration);
2023
services.AddEnyimMemcached(options => options.AddServer("memcached", 11211));
2124
services.AddLogging();
2225
IServiceProvider serviceProvider = services.BuildServiceProvider();

Enyim.Caching/Configuration/MemcachedClientConfiguration.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Enyim.Caching.Memcached.Protocol.Binary;
77
using Microsoft.Extensions.Logging;
88
using Microsoft.Extensions.Options;
9+
using Microsoft.Extensions.Configuration;
910

1011
namespace Enyim.Caching.Configuration
1112
{
@@ -26,6 +27,7 @@ public class MemcachedClientConfiguration : IMemcachedClientConfiguration
2627
public MemcachedClientConfiguration(
2728
ILoggerFactory loggerFactory,
2829
IOptions<MemcachedClientOptions> optionsAccessor,
30+
IConfiguration configuration,
2931
ITranscoder transcoder = null,
3032
IMemcachedKeyTransformer keyTransformer = null)
3133
{
@@ -37,6 +39,11 @@ public MemcachedClientConfiguration(
3739
_logger = loggerFactory.CreateLogger<MemcachedClientConfiguration>();
3840

3941
var options = optionsAccessor.Value;
42+
if(options == null || options.Servers.Count == 0)
43+
{
44+
configuration.GetSection("enyimMemcached").Bind(options);
45+
}
46+
4047
Servers = new List<EndPoint>();
4148
foreach (var server in options.Servers)
4249
{

Enyim.Caching/Enyim.Caching.csproj

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<Description>EnyimMemcachedCore is a Memcached client library for .NET Core. Usage: Add services.AddEnyimMemcached(...) and app.UseEnyimMemcached() in Startup. Add IMemcachedClient into constructor.</Description>
5-
<VersionPrefix>2.1.1</VersionPrefix>
5+
<VersionPrefix>2.1.2</VersionPrefix>
66
<Authors>cnblogs.com</Authors>
77
<TargetFramework>netstandard2.0</TargetFramework>
88
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
@@ -16,13 +16,13 @@
1616
</PropertyGroup>
1717

1818
<ItemGroup>
19-
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="2.0.0" />
20-
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.0.0" />
21-
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.0.0" />
22-
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
23-
<PackageReference Include="Microsoft.Extensions.Options" Version="2.0.0" />
24-
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="2.0.0" />
25-
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.0.1" />
19+
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="2.0.2" />
20+
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.0.2" />
21+
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.0.2" />
22+
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
23+
<PackageReference Include="Microsoft.Extensions.Options" Version="2.0.2" />
24+
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="2.0.2" />
25+
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.0.3" />
2626
<PackageReference Include="Newtonsoft.Json.Bson" Version="1.0.1" />
2727
</ItemGroup>
2828
</Project>

Enyim.Caching/EnyimMemcachedServiceCollectionExtensions.cs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,17 @@ namespace Microsoft.Extensions.DependencyInjection
1111
{
1212
public static class EnyimMemcachedServiceCollectionExtensions
1313
{
14+
/// <summary>
15+
/// Add EnyimMemcached to the specified <see cref="IServiceCollection"/>.
16+
/// Read configuration via IConfiguration.GetSection("enyimMemcached")
17+
/// </summary>
18+
/// <param name="services"></param>
19+
/// <returns></returns>
20+
public static IServiceCollection AddEnyimMemcached(this IServiceCollection services)
21+
{
22+
return AddEnyimMemcachedInternal(services, null);
23+
}
24+
1425
public static IServiceCollection AddEnyimMemcached(this IServiceCollection services, Action<MemcachedClientOptions> setupAction)
1526
{
1627
if (services == null)
@@ -23,7 +34,7 @@ public static IServiceCollection AddEnyimMemcached(this IServiceCollection servi
2334
throw new ArgumentNullException(nameof(setupAction));
2435
}
2536

26-
return AddEnyimMemcached(services, s => s.Configure(setupAction));
37+
return AddEnyimMemcachedInternal(services, s => s.Configure(setupAction));
2738
}
2839

2940
public static IServiceCollection AddEnyimMemcached(this IServiceCollection services, IConfigurationSection configurationSection)
@@ -38,7 +49,7 @@ public static IServiceCollection AddEnyimMemcached(this IServiceCollection servi
3849
throw new ArgumentNullException(nameof(configurationSection));
3950
}
4051

41-
return AddEnyimMemcached(services, s => s.Configure<MemcachedClientOptions>(configurationSection));
52+
return AddEnyimMemcachedInternal(services, s => s.Configure<MemcachedClientOptions>(configurationSection));
4253
}
4354

4455
public static IServiceCollection AddEnyimMemcached(this IServiceCollection services, IConfiguration configuration, string sectionKey = "enyimMemcached")
@@ -53,13 +64,13 @@ public static IServiceCollection AddEnyimMemcached(this IServiceCollection servi
5364
throw new ArgumentNullException(nameof(configuration));
5465
}
5566

56-
return AddEnyimMemcached(services, s => s.Configure<MemcachedClientOptions>(configuration.GetSection(sectionKey)));
67+
return AddEnyimMemcachedInternal(services, s => s.Configure<MemcachedClientOptions>(configuration.GetSection(sectionKey)));
5768
}
5869

59-
private static IServiceCollection AddEnyimMemcached(IServiceCollection services, Action<IServiceCollection> configure)
70+
private static IServiceCollection AddEnyimMemcachedInternal(IServiceCollection services, Action<IServiceCollection> configure)
6071
{
6172
services.AddOptions();
62-
configure(services);
73+
configure?.Invoke(services);
6374

6475
services.TryAddSingleton<ITranscoder, DefaultTranscoder>();
6576
services.TryAddSingleton<IMemcachedKeyTransformer, DefaultKeyTransformer>();

MemcachedTest/FailurePolicyTest.cs

Lines changed: 62 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -9,85 +9,88 @@
99
using Xunit;
1010
using Microsoft.Extensions.DependencyInjection;
1111
using Microsoft.Extensions.Logging;
12+
using Microsoft.Extensions.Configuration;
1213

1314
namespace MemcachedTest
1415
{
15-
public class FailurePolicyTest
16-
{
17-
[Fact]
18-
public void TestIfCalled()
19-
{
20-
IServiceCollection services = new ServiceCollection();
21-
services.AddEnyimMemcached(options => options.AddServer("memcached", 11212));
22-
services.AddLogging();
23-
IServiceProvider serviceProvider = services.BuildServiceProvider();
24-
16+
public class FailurePolicyTest
17+
{
18+
[Fact]
19+
public void TestIfCalled()
20+
{
21+
IServiceProvider serviceProvider = getServiceProvider();
2522
var config = serviceProvider.GetService<IMemcachedClientConfiguration>();
2623
config.SocketPool.FailurePolicyFactory = new FakePolicy();
2724
config.SocketPool.ConnectionTimeout = TimeSpan.FromSeconds(1);
2825
config.SocketPool.ReceiveTimeout = TimeSpan.FromSeconds(1);
2926

3027
var logger = serviceProvider.GetService<ILoggerFactory>();
3128

32-
var client = new MemcachedClient(logger, config);
29+
var client = new MemcachedClient(logger, config);
3330

3431
Assert.Null(client.Get("a"));
35-
}
36-
37-
class FakePolicy : INodeFailurePolicy, INodeFailurePolicyFactory
38-
{
39-
bool INodeFailurePolicy.ShouldFail()
40-
{
41-
Assert.True(true);
42-
43-
return true;
44-
}
45-
46-
INodeFailurePolicy INodeFailurePolicyFactory.Create(IMemcachedNode node)
47-
{
48-
return new FakePolicy();
49-
}
50-
}
51-
52-
[Fact]
53-
public void TestThrottlingFailurePolicy()
54-
{
55-
IServiceCollection services = new ServiceCollection();
56-
services.AddEnyimMemcached(options => options.AddServer("localhost", 11212));
57-
services.AddLogging();
58-
IServiceProvider serviceProvider = services.BuildServiceProvider();
59-
60-
var config = serviceProvider.GetService<IMemcachedClientConfiguration>();
61-
config.SocketPool.FailurePolicyFactory = new ThrottlingFailurePolicyFactory(4, TimeSpan.FromMilliseconds(2000));
62-
config.SocketPool.ConnectionTimeout = TimeSpan.FromMilliseconds(5);
63-
config.SocketPool.ReceiveTimeout = TimeSpan.FromMilliseconds(5);
64-
config.SocketPool.MinPoolSize = 1;
65-
config.SocketPool.MaxPoolSize = 1;
32+
}
33+
34+
class FakePolicy : INodeFailurePolicy, INodeFailurePolicyFactory
35+
{
36+
bool INodeFailurePolicy.ShouldFail()
37+
{
38+
Assert.True(true);
39+
40+
return true;
41+
}
42+
43+
INodeFailurePolicy INodeFailurePolicyFactory.Create(IMemcachedNode node)
44+
{
45+
return new FakePolicy();
46+
}
47+
}
48+
49+
[Fact]
50+
public void TestThrottlingFailurePolicy()
51+
{
52+
var serviceProvider = getServiceProvider();
53+
var config = serviceProvider.GetService<IMemcachedClientConfiguration>();
54+
config.SocketPool.FailurePolicyFactory = new ThrottlingFailurePolicyFactory(4, TimeSpan.FromMilliseconds(2000));
55+
config.SocketPool.ConnectionTimeout = TimeSpan.FromMilliseconds(5);
56+
config.SocketPool.ReceiveTimeout = TimeSpan.FromMilliseconds(5);
57+
config.SocketPool.MinPoolSize = 1;
58+
config.SocketPool.MaxPoolSize = 1;
6659

6760
var logger = serviceProvider.GetService<ILoggerFactory>();
6861
var client = new MemcachedClient(logger, config);
6962
var canFail = false;
70-
var didFail = false;
63+
var didFail = false;
7164

72-
client.NodeFailed += node =>
73-
{
74-
Assert.True(canFail, "canfail");
65+
client.NodeFailed += node =>
66+
{
67+
Assert.True(canFail, "canfail");
7568

76-
didFail = true;
77-
};
69+
didFail = true;
70+
};
7871

79-
Assert.Null(client.Get("a"));
80-
Assert.Null(client.Get("a"));
72+
Assert.Null(client.Get("a"));
73+
Assert.Null(client.Get("a"));
8174

82-
canFail = true;
83-
Thread.Sleep(2000);
75+
canFail = true;
76+
Thread.Sleep(2000);
8477

85-
Assert.Null(client.Get("a"));
86-
Assert.Null(client.Get("a"));
87-
Assert.Null(client.Get("a"));
88-
Assert.Null(client.Get("a"));
78+
Assert.Null(client.Get("a"));
79+
Assert.Null(client.Get("a"));
80+
Assert.Null(client.Get("a"));
81+
Assert.Null(client.Get("a"));
8982

90-
Assert.True(didFail, "didfail");
91-
}
92-
}
83+
Assert.True(didFail, "didfail");
84+
}
85+
86+
private ServiceProvider getServiceProvider()
87+
{
88+
IServiceCollection services = new ServiceCollection();
89+
var configuration = new ConfigurationBuilder().Build();
90+
services.AddSingleton<IConfiguration>(configuration);
91+
services.AddEnyimMemcached(options => options.AddServer("localhost", 11212));
92+
services.AddLogging();
93+
return services.BuildServiceProvider();
94+
}
95+
}
9396
}

MemcachedTest/MemcachedClientTest.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
using Microsoft.Extensions.Logging;
1010
using System.Threading.Tasks;
1111
using System.Linq;
12+
using Microsoft.Extensions.Configuration;
13+
using System.IO;
1214

1315
namespace MemcachedTest
1416
{
@@ -29,11 +31,13 @@ protected virtual MemcachedClient GetClient(MemcachedProtocol protocol = Memcach
2931
// options.Transcoder = "BinaryFormatterTranscoder";
3032
//}
3133
});
32-
if(useBinaryFormatterTranscoder)
34+
if (useBinaryFormatterTranscoder)
3335
{
34-
services.AddSingleton<ITranscoder,BinaryFormatterTranscoder>();
36+
services.AddSingleton<ITranscoder, BinaryFormatterTranscoder>();
3537
}
3638

39+
var configuration = new ConfigurationBuilder().Build();
40+
services.AddSingleton<IConfiguration>(configuration);
3741
services.AddLogging(builder => builder.SetMinimumLevel(LogLevel.Error).AddConsole());
3842

3943
IServiceProvider serviceProvider = services.BuildServiceProvider();

MemcachedTest/MemcachedTest.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
</PropertyGroup>
66
<ItemGroup>
77
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.0.0" />
8-
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.0" />
9-
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.0.0" />
10-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
8+
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.2" />
9+
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.0.2" />
10+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.7.2" />
1111
<PackageReference Include="xunit" Version="2.3.1" />
1212
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
1313
</ItemGroup>

SampleWebApp/SampleWebApp.csproj

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

88
<ItemGroup>
9-
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.3" />
9+
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.8" />
1010
</ItemGroup>
1111

1212
<ItemGroup>

SampleWebApp/Startup.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ public Startup(IHostingEnvironment env)
3232

3333
public void ConfigureServices(IServiceCollection services)
3434
{
35-
services.AddEnyimMemcached(Configuration);
35+
services.AddEnyimMemcached();
36+
//services.AddEnyimMemcached(Configuration);
3637
//services.AddEnyimMemcached(Configuration, "enyimMemcached");
3738
//services.AddEnyimMemcached(Configuration.GetSection("enyimMemcached"));
3839
}

0 commit comments

Comments
 (0)