【问题标题】:How to create an IOptions<T> from a custom instance of T (not via DI)如何从 T 的自定义实例创建 IOptions<T>(不是通过 DI)
【发布时间】:2018-12-28 18:16:21
【问题描述】:

我想将一个值传递给IOptions&lt;T&gt; 参数。

我只能找到使用IOptions&lt;T&gt;进行配置的例子,但是我需要在调用方法时定义一个自定义值

【问题讨论】:

  • 将接口实现为具体类并将其作为参数传递...?或者,如果代码允许并且不需要选项,您可以传递一个空值。
  • @Adriani6 如果我通过 null,它会失败。它在一个构造函数中,我正在调用 base 所以我不能真正创建新对象。我会用更多代码更新问题
  • this answer 有帮助吗?
  • IOptions Injection的可能重复
  • @Hasan 请阅读问题。我只能找到带有配置和注入的 IOptions 示例。这不是我想要的

标签: c# asp.net-core


【解决方案1】:

我假设您正在询问如何创建自定义 IOptions&lt;TOptionClass&gt; 值,您可以在其中指定要使用的 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 类),但肯定有可能,并且如果您在许多不同的地方使用这种技术可能会很有用。

【讨论】:

    【解决方案2】:

    我的解决方案:

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

    【讨论】:

      猜你喜欢
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多