繁体   English   中英

如何创建一个IOptions <T> 从T的自定义实例(不是通过DI)

[英]How to create an IOptions<T> from a custom instance of T (not via DI)

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

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

我假设您正在询问如何在指定要使用的T实例的地方创建自定义IOptions<TOptionClass>值。 这是您可以执行的操作:

假设您在示例中有一个名为IdentityOptions的类。

首先创建它的一个实例:

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

然后将其转换为Option容器:

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM