diff --git a/Enyim.Caching.Tests/Enyim.Caching.Tests.csproj b/Enyim.Caching.Tests/Enyim.Caching.Tests.csproj index a3fc1b41..77ce0f23 100644 --- a/Enyim.Caching.Tests/Enyim.Caching.Tests.csproj +++ b/Enyim.Caching.Tests/Enyim.Caching.Tests.csproj @@ -5,8 +5,8 @@ - - + + diff --git a/Enyim.Caching.Tests/MemcachedClientTestsBase.cs b/Enyim.Caching.Tests/MemcachedClientTestsBase.cs index 7e5f1eb4..ef910f69 100644 --- a/Enyim.Caching.Tests/MemcachedClientTestsBase.cs +++ b/Enyim.Caching.Tests/MemcachedClientTestsBase.cs @@ -7,6 +7,7 @@ using Enyim.Caching.Memcached; using Xunit; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Configuration; namespace Enyim.Caching.Tests { @@ -17,6 +18,8 @@ public abstract class MemcachedClientTestsBase public MemcachedClientTestsBase() { IServiceCollection services = new ServiceCollection(); + var configuration = new ConfigurationBuilder().Build(); + services.AddSingleton(configuration); services.AddEnyimMemcached(options => options.AddServer("memcached", 11211)); services.AddLogging(); IServiceProvider serviceProvider = services.BuildServiceProvider(); diff --git a/Enyim.Caching/Configuration/MemcachedClientConfiguration.cs b/Enyim.Caching/Configuration/MemcachedClientConfiguration.cs index 998a3012..c4ed6b91 100755 --- a/Enyim.Caching/Configuration/MemcachedClientConfiguration.cs +++ b/Enyim.Caching/Configuration/MemcachedClientConfiguration.cs @@ -6,6 +6,7 @@ using Enyim.Caching.Memcached.Protocol.Binary; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Microsoft.Extensions.Configuration; namespace Enyim.Caching.Configuration { @@ -26,6 +27,7 @@ public class MemcachedClientConfiguration : IMemcachedClientConfiguration public MemcachedClientConfiguration( ILoggerFactory loggerFactory, IOptions optionsAccessor, + IConfiguration configuration, ITranscoder transcoder = null, IMemcachedKeyTransformer keyTransformer = null) { @@ -37,6 +39,11 @@ public MemcachedClientConfiguration( _logger = loggerFactory.CreateLogger(); var options = optionsAccessor.Value; + if(options == null || options.Servers.Count == 0) + { + configuration.GetSection("enyimMemcached").Bind(options); + } + Servers = new List(); foreach (var server in options.Servers) { diff --git a/Enyim.Caching/Enyim.Caching.csproj b/Enyim.Caching/Enyim.Caching.csproj index 6d1c8df3..eb689dff 100755 --- a/Enyim.Caching/Enyim.Caching.csproj +++ b/Enyim.Caching/Enyim.Caching.csproj @@ -2,7 +2,7 @@ EnyimMemcachedCore is a Memcached client library for .NET Core. Usage: Add services.AddEnyimMemcached(...) and app.UseEnyimMemcached() in Startup. Add IMemcachedClient into constructor. - 2.1.1 + 2.1.2 cnblogs.com netstandard2.0 true @@ -16,13 +16,13 @@ - - - - - - - + + + + + + + diff --git a/Enyim.Caching/EnyimMemcachedServiceCollectionExtensions.cs b/Enyim.Caching/EnyimMemcachedServiceCollectionExtensions.cs index 3a130839..a2c6a290 100644 --- a/Enyim.Caching/EnyimMemcachedServiceCollectionExtensions.cs +++ b/Enyim.Caching/EnyimMemcachedServiceCollectionExtensions.cs @@ -11,6 +11,17 @@ namespace Microsoft.Extensions.DependencyInjection { public static class EnyimMemcachedServiceCollectionExtensions { + /// + /// Add EnyimMemcached to the specified . + /// Read configuration via IConfiguration.GetSection("enyimMemcached") + /// + /// + /// + public static IServiceCollection AddEnyimMemcached(this IServiceCollection services) + { + return AddEnyimMemcachedInternal(services, null); + } + public static IServiceCollection AddEnyimMemcached(this IServiceCollection services, Action setupAction) { if (services == null) @@ -23,7 +34,7 @@ public static IServiceCollection AddEnyimMemcached(this IServiceCollection servi throw new ArgumentNullException(nameof(setupAction)); } - return AddEnyimMemcached(services, s => s.Configure(setupAction)); + return AddEnyimMemcachedInternal(services, s => s.Configure(setupAction)); } public static IServiceCollection AddEnyimMemcached(this IServiceCollection services, IConfigurationSection configurationSection) @@ -38,7 +49,7 @@ public static IServiceCollection AddEnyimMemcached(this IServiceCollection servi throw new ArgumentNullException(nameof(configurationSection)); } - return AddEnyimMemcached(services, s => s.Configure(configurationSection)); + return AddEnyimMemcachedInternal(services, s => s.Configure(configurationSection)); } public static IServiceCollection AddEnyimMemcached(this IServiceCollection services, IConfiguration configuration, string sectionKey = "enyimMemcached") @@ -53,13 +64,13 @@ public static IServiceCollection AddEnyimMemcached(this IServiceCollection servi throw new ArgumentNullException(nameof(configuration)); } - return AddEnyimMemcached(services, s => s.Configure(configuration.GetSection(sectionKey))); + return AddEnyimMemcachedInternal(services, s => s.Configure(configuration.GetSection(sectionKey))); } - private static IServiceCollection AddEnyimMemcached(IServiceCollection services, Action configure) + private static IServiceCollection AddEnyimMemcachedInternal(IServiceCollection services, Action configure) { services.AddOptions(); - configure(services); + configure?.Invoke(services); services.TryAddSingleton(); services.TryAddSingleton(); diff --git a/MemcachedTest/FailurePolicyTest.cs b/MemcachedTest/FailurePolicyTest.cs index 5bf861a6..921427e1 100644 --- a/MemcachedTest/FailurePolicyTest.cs +++ b/MemcachedTest/FailurePolicyTest.cs @@ -9,19 +9,16 @@ using Xunit; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Configuration; namespace MemcachedTest { - public class FailurePolicyTest - { - [Fact] - public void TestIfCalled() - { - IServiceCollection services = new ServiceCollection(); - services.AddEnyimMemcached(options => options.AddServer("memcached", 11212)); - services.AddLogging(); - IServiceProvider serviceProvider = services.BuildServiceProvider(); - + public class FailurePolicyTest + { + [Fact] + public void TestIfCalled() + { + IServiceProvider serviceProvider = getServiceProvider(); var config = serviceProvider.GetService(); config.SocketPool.FailurePolicyFactory = new FakePolicy(); config.SocketPool.ConnectionTimeout = TimeSpan.FromSeconds(1); @@ -29,65 +26,71 @@ public void TestIfCalled() var logger = serviceProvider.GetService(); - var client = new MemcachedClient(logger, config); + var client = new MemcachedClient(logger, config); Assert.Null(client.Get("a")); - } - - class FakePolicy : INodeFailurePolicy, INodeFailurePolicyFactory - { - bool INodeFailurePolicy.ShouldFail() - { - Assert.True(true); - - return true; - } - - INodeFailurePolicy INodeFailurePolicyFactory.Create(IMemcachedNode node) - { - return new FakePolicy(); - } - } - - [Fact] - public void TestThrottlingFailurePolicy() - { - IServiceCollection services = new ServiceCollection(); - services.AddEnyimMemcached(options => options.AddServer("localhost", 11212)); - services.AddLogging(); - IServiceProvider serviceProvider = services.BuildServiceProvider(); - - var config = serviceProvider.GetService(); - config.SocketPool.FailurePolicyFactory = new ThrottlingFailurePolicyFactory(4, TimeSpan.FromMilliseconds(2000)); - config.SocketPool.ConnectionTimeout = TimeSpan.FromMilliseconds(5); - config.SocketPool.ReceiveTimeout = TimeSpan.FromMilliseconds(5); - config.SocketPool.MinPoolSize = 1; - config.SocketPool.MaxPoolSize = 1; + } + + class FakePolicy : INodeFailurePolicy, INodeFailurePolicyFactory + { + bool INodeFailurePolicy.ShouldFail() + { + Assert.True(true); + + return true; + } + + INodeFailurePolicy INodeFailurePolicyFactory.Create(IMemcachedNode node) + { + return new FakePolicy(); + } + } + + [Fact] + public void TestThrottlingFailurePolicy() + { + var serviceProvider = getServiceProvider(); + var config = serviceProvider.GetService(); + config.SocketPool.FailurePolicyFactory = new ThrottlingFailurePolicyFactory(4, TimeSpan.FromMilliseconds(2000)); + config.SocketPool.ConnectionTimeout = TimeSpan.FromMilliseconds(5); + config.SocketPool.ReceiveTimeout = TimeSpan.FromMilliseconds(5); + config.SocketPool.MinPoolSize = 1; + config.SocketPool.MaxPoolSize = 1; var logger = serviceProvider.GetService(); var client = new MemcachedClient(logger, config); var canFail = false; - var didFail = false; + var didFail = false; - client.NodeFailed += node => - { - Assert.True(canFail, "canfail"); + client.NodeFailed += node => + { + Assert.True(canFail, "canfail"); - didFail = true; - }; + didFail = true; + }; - Assert.Null(client.Get("a")); - Assert.Null(client.Get("a")); + Assert.Null(client.Get("a")); + Assert.Null(client.Get("a")); - canFail = true; - Thread.Sleep(2000); + canFail = true; + Thread.Sleep(2000); - Assert.Null(client.Get("a")); - Assert.Null(client.Get("a")); - Assert.Null(client.Get("a")); - Assert.Null(client.Get("a")); + Assert.Null(client.Get("a")); + Assert.Null(client.Get("a")); + Assert.Null(client.Get("a")); + Assert.Null(client.Get("a")); - Assert.True(didFail, "didfail"); - } - } + Assert.True(didFail, "didfail"); + } + + private ServiceProvider getServiceProvider() + { + IServiceCollection services = new ServiceCollection(); + var configuration = new ConfigurationBuilder().Build(); + services.AddSingleton(configuration); + services.AddEnyimMemcached(options => options.AddServer("localhost", 11212)); + services.AddLogging(); + return services.BuildServiceProvider(); + } + } } diff --git a/MemcachedTest/MemcachedClientTest.cs b/MemcachedTest/MemcachedClientTest.cs index 9c3eef0b..9db33c6d 100755 --- a/MemcachedTest/MemcachedClientTest.cs +++ b/MemcachedTest/MemcachedClientTest.cs @@ -9,6 +9,8 @@ using Microsoft.Extensions.Logging; using System.Threading.Tasks; using System.Linq; +using Microsoft.Extensions.Configuration; +using System.IO; namespace MemcachedTest { @@ -29,11 +31,13 @@ protected virtual MemcachedClient GetClient(MemcachedProtocol protocol = Memcach // options.Transcoder = "BinaryFormatterTranscoder"; //} }); - if(useBinaryFormatterTranscoder) + if (useBinaryFormatterTranscoder) { - services.AddSingleton(); + services.AddSingleton(); } + var configuration = new ConfigurationBuilder().Build(); + services.AddSingleton(configuration); services.AddLogging(builder => builder.SetMinimumLevel(LogLevel.Error).AddConsole()); IServiceProvider serviceProvider = services.BuildServiceProvider(); diff --git a/MemcachedTest/MemcachedTest.csproj b/MemcachedTest/MemcachedTest.csproj index 207fee3e..1baa5e22 100755 --- a/MemcachedTest/MemcachedTest.csproj +++ b/MemcachedTest/MemcachedTest.csproj @@ -5,9 +5,9 @@ - - - + + + diff --git a/SampleWebApp/SampleWebApp.csproj b/SampleWebApp/SampleWebApp.csproj index 22ee8fe2..2f60b431 100644 --- a/SampleWebApp/SampleWebApp.csproj +++ b/SampleWebApp/SampleWebApp.csproj @@ -6,7 +6,7 @@ - + diff --git a/SampleWebApp/Startup.cs b/SampleWebApp/Startup.cs index fbf84023..d262ba29 100644 --- a/SampleWebApp/Startup.cs +++ b/SampleWebApp/Startup.cs @@ -32,7 +32,8 @@ public Startup(IHostingEnvironment env) public void ConfigureServices(IServiceCollection services) { - services.AddEnyimMemcached(Configuration); + services.AddEnyimMemcached(); + //services.AddEnyimMemcached(Configuration); //services.AddEnyimMemcached(Configuration, "enyimMemcached"); //services.AddEnyimMemcached(Configuration.GetSection("enyimMemcached")); } diff --git a/SampleWebApp/web.config b/SampleWebApp/web.config deleted file mode 100644 index dc0514fc..00000000 --- a/SampleWebApp/web.config +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - -