如何创建IOptions 来自T的自定义实例(不是通过DI)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何创建IOptions 来自T的自定义实例(不是通过DI)相关的知识,希望对你有一定的参考价值。

我想将值传递给IOptions<T>参数。

我只能找到使用IOptions<T>配置的示例,但我需要在调用方法时定义自定义值。

答案

我假设您正在询问如何创建自定义IOptions<TOptionClass>值,您可以在其中指定要使用的T实例。以下是如何做到这一点:

假设您有一个名为IdentityOptions的类,如您的示例所示。

首先创建一个实例:

var optionsInstance = new IdentityOptions();
// ... set properties on it as needed

然后将其转换为Option-container:

IOptions<IdentityOptions> optionParameter = Options.Create(optionsInstance);

MSDN

更新:我比OP自己的解决方案慢了几秒钟。让我添加一个可能的扩展方法解决方案,这样这个答案仍然有一些附加价值(未测试):

public static IOptions<TOptions> AsIOption<TOptions>(this TOptions optionInstance) where TOptions : class, new()
{
    return Microsoft.Extensions.Options.Options.Create(optionInstance);
}

然后你可以使用optionInstance.AsIOption()。我不确定它是否值得付出努力(如果没有必要,我不喜欢污染Object类),但当然可能,如果你在许多不同的地方使用这种技术可能会有用。

另一答案

我的解决方案

public LCSignInManager(UserManager<Profile> userManager, IdentityDbContext db, IHttpContextAccessor contextAccessor, IUserClaimsPrincipalFactory<Profile> claimsFactory, IOptions<IdentityOptions> optionsAccessor = null) : base(userManager, contextAccessor, claimsFactory, optionsAccessor, new LoggerFactory().CreateLogger<LCSignInManager>(), (IAuthenticationSchemeProvider)new AuthenticationSchemeProvider(GetOption()).GetDefaultAuthenticateSchemeAsync().Result)
{
    _userManager = userManager;
    this.DbContext = db;
}

private static IOptions<AuthenticationOptions> GetOption()
{
    var settings = new AuthenticationOptions
        {

        };

    IOptions<AuthenticationOptions> result = Microsoft.Extensions.Options.Options.Create(settings);

    return result;
}

以上是关于如何创建IOptions 来自T的自定义实例(不是通过DI)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ConfigureServices 中解析 IOptions 实例?

如何在 ConfigureServices 中解析 IOptions 实例?

来自 Interface Builder 的自定义 UIView

是否有与 IServiceCollection 的“TryAdd”方法等价的方法用于 IOptions<T> 模式?

处理来自 PHPUnit (Laravel 5.2) 的自定义异常

我们啥时候需要 IOptions?