Browse Source

Merge pull request #6368 from abpframework/maliming/patch-AbpOptionsFactory

Use AbpDynamicOptionsManager to replace AbpOptionsFactory.
pull/6389/head
liangshiwei 6 years ago
committed by GitHub
parent
commit
577e0f2c21
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 8
      framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationMiddleware.cs
  2. 28
      framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationOptionsFactory.cs
  3. 32
      framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationOptionsManager.cs
  4. 11
      framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs
  5. 4
      framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/IAbpRequestLocalizationOptionsProvider.cs
  6. 2
      framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/AbpAspNetCoreModule.cs
  7. 4
      framework/src/Volo.Abp.Core/Volo/Abp/Options/AbpDynamicOptionsManager.cs
  8. 50
      framework/src/Volo.Abp.Core/Volo/Abp/Options/AbpOptionsFactory.cs
  9. 2
      framework/src/Volo.Abp.Ldap/Volo.Abp.Ldap.csproj
  10. 22
      framework/src/Volo.Abp.Ldap/Volo/Abp/Ldap/AbpAbpLdapOptionsManager.cs
  11. 3
      framework/src/Volo.Abp.Ldap/Volo/Abp/Ldap/AbpLdapModule.cs
  12. 6
      framework/src/Volo.Abp.Ldap/Volo/Abp/Ldap/ILdapManager.cs
  13. 34
      framework/src/Volo.Abp.Ldap/Volo/Abp/Ldap/LdapManager.cs
  14. 10
      framework/test/Volo.Abp.Ldap.Tests/Volo/Abp/Ldap/LdapManager_Tests.cs
  15. 2
      framework/test/Volo.Abp.Ldap.Tests/Volo/Abp/Ldap/LdapOptions_Tests.cs
  16. 2
      modules/blogging/app/Volo.BloggingTestApp/BloggingTestAppModule.cs
  17. 2
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityOptionsManager.cs

8
framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationMiddleware.cs

@ -23,15 +23,13 @@ namespace Microsoft.AspNetCore.RequestLocalization
public async Task InvokeAsync(HttpContext context, RequestDelegate next) public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{ {
var middleware = new RequestLocalizationMiddleware( var middleware = new RequestLocalizationMiddleware(
next, next,
new OptionsWrapper<RequestLocalizationOptions>( new OptionsWrapper<RequestLocalizationOptions>(await _requestLocalizationOptionsProvider.GetLocalizationOptionsAsync()), _loggerFactory
await _requestLocalizationOptionsProvider.GetLocalizationOptionsAsync()
),
_loggerFactory
); );
await middleware.Invoke(context); await middleware.Invoke(context);
} }
} }
} }

28
framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationOptionsFactory.cs

@ -1,28 +0,0 @@
using System.Collections.Generic;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Options;
using Volo.Abp.Options;
namespace Microsoft.AspNetCore.RequestLocalization
{
public class AbpRequestLocalizationOptionsFactory : AbpOptionsFactory<RequestLocalizationOptions>
{
private readonly IAbpRequestLocalizationOptionsProvider _abpRequestLocalizationOptionsProvider;
public AbpRequestLocalizationOptionsFactory(
IAbpRequestLocalizationOptionsProvider abpRequestLocalizationOptionsProvider,
IEnumerable<IConfigureOptions<RequestLocalizationOptions>> setups,
IEnumerable<IPostConfigureOptions<RequestLocalizationOptions>> postConfigures)
: base(
setups,
postConfigures)
{
_abpRequestLocalizationOptionsProvider = abpRequestLocalizationOptionsProvider;
}
public override RequestLocalizationOptions Create(string name)
{
return _abpRequestLocalizationOptionsProvider.GetLocalizationOptions();
}
}
}

32
framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/AbpRequestLocalizationOptionsManager.cs

@ -0,0 +1,32 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Options;
using Volo.Abp.Options;
namespace Microsoft.AspNetCore.RequestLocalization
{
public class AbpRequestLocalizationOptionsManager : AbpDynamicOptionsManager<RequestLocalizationOptions>
{
private RequestLocalizationOptions _options;
private readonly IAbpRequestLocalizationOptionsProvider _abpRequestLocalizationOptionsProvider;
public AbpRequestLocalizationOptionsManager(
IOptionsFactory<RequestLocalizationOptions> factory,
IAbpRequestLocalizationOptionsProvider abpRequestLocalizationOptionsProvider)
: base(factory)
{
_abpRequestLocalizationOptionsProvider = abpRequestLocalizationOptionsProvider;
}
public override RequestLocalizationOptions Get(string name)
{
return _options ?? base.Get(name);
}
protected override async Task OverrideOptionsAsync(string name, RequestLocalizationOptions options)
{
_options = await _abpRequestLocalizationOptionsProvider.GetLocalizationOptionsAsync();
}
}
}

11
framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs

@ -11,7 +11,6 @@ using Nito.AsyncEx;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Localization; using Volo.Abp.Localization;
using Volo.Abp.Settings; using Volo.Abp.Settings;
using Volo.Abp.Threading;
namespace Microsoft.AspNetCore.RequestLocalization namespace Microsoft.AspNetCore.RequestLocalization
{ {
@ -33,16 +32,6 @@ namespace Microsoft.AspNetCore.RequestLocalization
_optionsAction = optionsAction; _optionsAction = optionsAction;
} }
public RequestLocalizationOptions GetLocalizationOptions()
{
if (_requestLocalizationOptions != null)
{
return _requestLocalizationOptions;
}
return AsyncHelper.RunSync(GetLocalizationOptionsAsync);
}
public async Task<RequestLocalizationOptions> GetLocalizationOptionsAsync() public async Task<RequestLocalizationOptions> GetLocalizationOptionsAsync()
{ {
if (_requestLocalizationOptions == null) if (_requestLocalizationOptions == null)

4
framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/IAbpRequestLocalizationOptionsProvider.cs

@ -8,8 +8,6 @@ namespace Microsoft.AspNetCore.RequestLocalization
{ {
void InitLocalizationOptions(Action<RequestLocalizationOptions> optionsAction = null); void InitLocalizationOptions(Action<RequestLocalizationOptions> optionsAction = null);
RequestLocalizationOptions GetLocalizationOptions();
Task<RequestLocalizationOptions> GetLocalizationOptionsAsync(); Task<RequestLocalizationOptions> GetLocalizationOptionsAsync();
} }
} }

2
framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/AbpAspNetCoreModule.cs

@ -38,7 +38,7 @@ namespace Volo.Abp.AspNetCore
AddAspNetServices(context.Services); AddAspNetServices(context.Services);
context.Services.AddObjectAccessor<IApplicationBuilder>(); context.Services.AddObjectAccessor<IApplicationBuilder>();
context.Services.Replace(ServiceDescriptor.Transient<IOptionsFactory<RequestLocalizationOptions>, AbpRequestLocalizationOptionsFactory>()); context.Services.AddAbpDynamicOptions<RequestLocalizationOptions, AbpRequestLocalizationOptionsManager>();
} }
private static void AddAspNetServices(IServiceCollection services) private static void AddAspNetServices(IServiceCollection services)

4
framework/src/Volo.Abp.Core/Volo/Abp/Options/AbpDynamicOptionsManager.cs

@ -16,9 +16,9 @@ namespace Volo.Abp.Options
public virtual Task SetAsync(string name) public virtual Task SetAsync(string name)
{ {
return OverrideOptionsAsync(base.Get(name)); return OverrideOptionsAsync(name, base.Get(name));
} }
protected abstract Task OverrideOptionsAsync(T options); protected abstract Task OverrideOptionsAsync(string name, T options);
} }
} }

50
framework/src/Volo.Abp.Core/Volo/Abp/Options/AbpOptionsFactory.cs

@ -4,21 +4,44 @@ using Microsoft.Extensions.Options;
namespace Volo.Abp.Options namespace Volo.Abp.Options
{ {
//TODO: Derive from OptionsFactory when this is released: https://github.com/aspnet/Options/pull/258 (or completely remove this!) //TODO: Derive from OptionsFactory when this is released: https://github.com/aspnet/Options/pull/258 (or completely remove this!)
// https://github.com/dotnet/runtime/blob/master/src/libraries/Microsoft.Extensions.Options/src/OptionsFactory.cs
public class AbpOptionsFactory<TOptions> : IOptionsFactory<TOptions> where TOptions : class, new() public class AbpOptionsFactory<TOptions> : IOptionsFactory<TOptions> where TOptions : class, new()
{ {
private readonly IEnumerable<IConfigureOptions<TOptions>> _setups; private readonly IEnumerable<IConfigureOptions<TOptions>> _setups;
private readonly IEnumerable<IPostConfigureOptions<TOptions>> _postConfigures; private readonly IEnumerable<IPostConfigureOptions<TOptions>> _postConfigures;
private readonly IEnumerable<IValidateOptions<TOptions>> _validations;
public AbpOptionsFactory(IEnumerable<IConfigureOptions<TOptions>> setups, IEnumerable<IPostConfigureOptions<TOptions>> postConfigures) public AbpOptionsFactory(
IEnumerable<IConfigureOptions<TOptions>> setups,
IEnumerable<IPostConfigureOptions<TOptions>> postConfigures)
: this(setups, postConfigures, validations: null)
{
}
public AbpOptionsFactory(
IEnumerable<IConfigureOptions<TOptions>> setups,
IEnumerable<IPostConfigureOptions<TOptions>> postConfigures,
IEnumerable<IValidateOptions<TOptions>> validations)
{ {
_setups = setups; _setups = setups;
_postConfigures = postConfigures; _postConfigures = postConfigures;
_validations = validations;
} }
public virtual TOptions Create(string name) public virtual TOptions Create(string name)
{ {
var options = new TOptions(); var options = new TOptions();
ConfigureOptions(name, options);
PostConfigureOptions(name, options);
ValidateOptions(name, options);
return options;
}
protected virtual void ConfigureOptions(string name, TOptions options)
{
foreach (var setup in _setups) foreach (var setup in _setups)
{ {
if (setup is IConfigureNamedOptions<TOptions> namedSetup) if (setup is IConfigureNamedOptions<TOptions> namedSetup)
@ -30,13 +53,34 @@ namespace Volo.Abp.Options
setup.Configure(options); setup.Configure(options);
} }
} }
}
protected virtual void PostConfigureOptions(string name, TOptions options)
{
foreach (var post in _postConfigures) foreach (var post in _postConfigures)
{ {
post.PostConfigure(name, options); post.PostConfigure(name, options);
} }
}
return options; protected virtual void ValidateOptions(string name, TOptions options)
{
if (_validations != null)
{
var failures = new List<string>();
foreach (var validate in _validations)
{
var result = validate.Validate(name, options);
if (result.Failed)
{
failures.AddRange(result.Failures);
}
}
if (failures.Count > 0)
{
throw new OptionsValidationException(name, typeof(TOptions), failures);
}
}
} }
} }
} }

2
framework/src/Volo.Abp.Ldap/Volo.Abp.Ldap.csproj

@ -15,7 +15,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Novell.Directory.Ldap.NETStandard" Version="3.2.0" /> <PackageReference Include="LdapForNet" Version="2.7.11" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

22
framework/src/Volo.Abp.Ldap/Volo/Abp/Ldap/AbpAbpLdapOptionsFactory.cs → framework/src/Volo.Abp.Ldap/Volo/Abp/Ldap/AbpAbpLdapOptionsManager.cs

@ -1,36 +1,22 @@
using System; using System;
using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Volo.Abp.Options; using Volo.Abp.Options;
using Volo.Abp.Settings; using Volo.Abp.Settings;
using Volo.Abp.Threading;
namespace Volo.Abp.Ldap namespace Volo.Abp.Ldap
{ {
public class AbpAbpLdapOptionsFactory : AbpOptionsFactory<AbpLdapOptions> public class AbpAbpLdapOptionsManager : AbpDynamicOptionsManager<AbpLdapOptions>
{ {
protected ISettingProvider SettingProvider { get; } protected ISettingProvider SettingProvider { get; }
public AbpAbpLdapOptionsFactory( public AbpAbpLdapOptionsManager(IOptionsFactory<AbpLdapOptions> factory, ISettingProvider settingProvider)
IEnumerable<IConfigureOptions<AbpLdapOptions>> setups, : base(factory)
IEnumerable<IPostConfigureOptions<AbpLdapOptions>> postConfigures,
ISettingProvider settingProvider)
: base(setups, postConfigures)
{ {
SettingProvider = settingProvider; SettingProvider = settingProvider;
} }
public override AbpLdapOptions Create(string name) protected override async Task OverrideOptionsAsync(string name, AbpLdapOptions options)
{
var options = base.Create(name);
AsyncHelper.RunSync(() => OverrideOptionsAsync(options));
return options;
}
protected virtual async Task OverrideOptionsAsync(AbpLdapOptions options)
{ {
options.ServerHost = await GetSettingOrDefaultValue(LdapSettingNames.ServerHost, options.ServerHost); options.ServerHost = await GetSettingOrDefaultValue(LdapSettingNames.ServerHost, options.ServerHost);
options.ServerPort = await SettingProvider.GetAsync(LdapSettingNames.ServerPort, options.ServerPort); options.ServerPort = await SettingProvider.GetAsync(LdapSettingNames.ServerPort, options.ServerPort);

3
framework/src/Volo.Abp.Ldap/Volo/Abp/Ldap/AbpLdapModule.cs

@ -18,8 +18,7 @@ namespace Volo.Abp.Ldap
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
context.Services.Replace(ServiceDescriptor.Transient<IOptionsFactory<AbpLdapOptions>, AbpAbpLdapOptionsFactory>()); context.Services.AddAbpDynamicOptions<AbpLdapOptions, AbpAbpLdapOptionsManager>();
context.Services.Replace(ServiceDescriptor.Scoped<IOptions<AbpLdapOptions>, OptionsManager<AbpLdapOptions>>());
var configuration = context.Services.GetConfiguration(); var configuration = context.Services.GetConfiguration();
var ldapConfiguration = configuration["Ldap"]; var ldapConfiguration = configuration["Ldap"];

6
framework/src/Volo.Abp.Ldap/Volo/Abp/Ldap/ILdapManager.cs

@ -1,7 +1,9 @@
namespace Volo.Abp.Ldap using System.Threading.Tasks;
namespace Volo.Abp.Ldap
{ {
public interface ILdapManager public interface ILdapManager
{ {
bool Authenticate(string username, string password); Task<bool> AuthenticateAsync(string username, string password);
} }
} }

34
framework/src/Volo.Abp.Ldap/Volo/Abp/Ldap/LdapManager.cs

@ -1,6 +1,8 @@
using System; using System;
using System.Threading.Tasks;
using LdapForNet;
using LdapForNet.Native;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Novell.Directory.Ldap;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
@ -15,17 +17,16 @@ namespace Volo.Abp.Ldap
public LdapManager(IOptions<AbpLdapOptions> ldapSettingsOptions) public LdapManager(IOptions<AbpLdapOptions> ldapSettingsOptions)
{ {
LdapOptions = ldapSettingsOptions.Value; LdapOptions = ldapSettingsOptions.Value;
Logger = NullLogger<LdapManager>.Instance; Logger = NullLogger<LdapManager>.Instance;
} }
public bool Authenticate(string username, string password) public virtual async Task<bool> AuthenticateAsync(string username, string password)
{ {
try try
{ {
using (var conn = CreateLdapConnection()) using (var conn = await CreateLdapConnectionAsync())
{ {
AuthenticateLdapConnection(conn, username, password); await AuthenticateLdapConnectionAsync(conn, username, password);
return true; return true;
} }
} }
@ -36,22 +37,33 @@ namespace Volo.Abp.Ldap
} }
} }
protected virtual ILdapConnection CreateLdapConnection() protected virtual async Task<ILdapConnection> CreateLdapConnectionAsync()
{ {
var ldapConnection = new LdapConnection(); var ldapConnection = new LdapConnection();
ConfigureLdapConnection(ldapConnection); await ConfigureLdapConnectionAsync(ldapConnection);
ldapConnection.Connect(LdapOptions.ServerHost, LdapOptions.ServerPort); await ConnectAsync(ldapConnection);
return ldapConnection; return ldapConnection;
} }
protected virtual void ConfigureLdapConnection(ILdapConnection connection) protected virtual Task ConfigureLdapConnectionAsync(ILdapConnection ldapConnection)
{ {
return Task.CompletedTask;
}
protected virtual Task ConnectAsync(ILdapConnection ldapConnection)
{
ldapConnection.Connect(LdapOptions.ServerHost, LdapOptions.ServerPort);
return Task.CompletedTask;
} }
protected virtual void AuthenticateLdapConnection(ILdapConnection connection, string username, string password) protected virtual async Task AuthenticateLdapConnectionAsync(ILdapConnection connection, string username, string password)
{ {
connection.Bind(username, password); await connection.BindAsync(Native.LdapAuthType.Simple, new LdapCredential()
{
UserName = username,
Password = password
});
} }
} }
} }

10
framework/test/Volo.Abp.Ldap.Tests/Volo/Abp/Ldap/LdapManager_Tests.cs

@ -1,4 +1,5 @@
using Shouldly; using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.Testing; using Volo.Abp.Testing;
using Xunit; using Xunit;
@ -19,10 +20,11 @@ namespace Volo.Abp.Ldap
} }
[Fact(Skip = "Required Ldap environment")] [Fact(Skip = "Required Ldap environment")]
public void Authenticate() public async Task AuthenticateAsync()
{ {
_ldapManager.Authenticate("cn=abp,dc=abp,dc=io", "123qwe").ShouldBe(true); (await _ldapManager.AuthenticateAsync("cn=abp,dc=abp,dc=io", "123qwe")).ShouldBe(true);
_ldapManager.Authenticate("NoExists", "123qwe").ShouldBe(false); (await _ldapManager.AuthenticateAsync("cn=abp,dc=abp,dc=io", "123123")).ShouldBe(false);
(await _ldapManager.AuthenticateAsync("NoExists", "123qwe")).ShouldBe(false);
} }
} }
} }

2
framework/test/Volo.Abp.Ldap.Tests/Volo/Abp/Ldap/LdapOptions_Tests.cs

@ -15,7 +15,7 @@ namespace Volo.Abp.Ldap
[Fact] [Fact]
public void Should_Resolve_AbpAbpLdapOptionsFactory() public void Should_Resolve_AbpAbpLdapOptionsFactory()
{ {
GetRequiredService<IOptionsFactory<AbpLdapOptions>>().ShouldBeOfType(typeof(AbpAbpLdapOptionsFactory)); GetRequiredService<IOptions<AbpLdapOptions>>().ShouldBeOfType(typeof(AbpAbpLdapOptionsManager));
} }
} }
} }

2
modules/blogging/app/Volo.BloggingTestApp/BloggingTestAppModule.cs

@ -166,7 +166,7 @@ namespace Volo.BloggingTestApp
app.UseAuthentication(); app.UseAuthentication();
app.UseRequestLocalization(app.ApplicationServices.GetRequiredService<IOptions<RequestLocalizationOptions>>().Value); app.UseAbpRequestLocalization();
app.UseConfiguredEndpoints(); app.UseConfiguredEndpoints();

2
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityOptionsManager.cs

@ -19,7 +19,7 @@ namespace Volo.Abp.Identity
SettingProvider = settingProvider; SettingProvider = settingProvider;
} }
protected override async Task OverrideOptionsAsync(IdentityOptions options) protected override async Task OverrideOptionsAsync(string name, IdentityOptions options)
{ {
options.Password.RequiredLength = await SettingProvider.GetAsync(IdentitySettingNames.Password.RequiredLength, options.Password.RequiredLength); options.Password.RequiredLength = await SettingProvider.GetAsync(IdentitySettingNames.Password.RequiredLength, options.Password.RequiredLength);
options.Password.RequiredUniqueChars = await SettingProvider.GetAsync(IdentitySettingNames.Password.RequiredUniqueChars, options.Password.RequiredUniqueChars); options.Password.RequiredUniqueChars = await SettingProvider.GetAsync(IdentitySettingNames.Password.RequiredUniqueChars, options.Password.RequiredUniqueChars);

Loading…
Cancel
Save