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

时间:2018-12-28 18:16:21

标签: c# asp.net-core

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

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

2 个答案:

答案 0 :(得分:0)

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

假设您的示例中有一个名为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类),但是肯定是可能的,并且如果您在许多不同的地方使用此技术,可能会很有用。

答案 1 :(得分:-1)

我的解决方案:

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