首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从T的自定义实例(而不是通过DI)创建IOptions<T>

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

Stack Overflow用户
提问于 2018-12-28 18:16:21
回答 2查看 2.9K关注 0票数 3

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

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

EN

回答 2

Stack Overflow用户

发布于 2018-12-28 18:47:57

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

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

首先创建它的一个实例:

代码语言:javascript
复制
var optionsInstance = new IdentityOptions();
// ... set properties on it as needed

然后将其转换为一个选项-容器:

代码语言:javascript
复制
IOptions<IdentityOptions> optionParameter = Options.Create(optionsInstance);

MSDN

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

代码语言:javascript
复制
public static IOptions<TOptions> AsIOption<TOptions>(this TOptions optionInstance) where TOptions : class, new()
{
    return Microsoft.Extensions.Options.Options.Create(optionInstance);
}

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

票数 4
EN

Stack Overflow用户

发布于 2018-12-28 18:46:39

我的解决方案:

代码语言:javascript
复制
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;
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53962701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档