何时使用ASP.NET 5选项模型

本文关键字:选项 模型 NET ASP 何时使 | 更新日期: 2023-09-27 18:19:58

在通过ASP.NET内脏进行调查的过程中,我发现了其中一些有趣的部分-OptionsModel。

Startup类中定义的示例代码:

// Add MVC services to the services container
services.AddMvc(configuration)
    .Configure<MvcOptions>(options =>
    {
        //Configure some MVC options like customizing the 
        // view engines, etc...
        options.ViewEngines.Insert(0, typeof(TestViewEngine));
    });

还有几个问题:

  1. 在您自己的解决方案中使用OptionsModel的好方法是什么
  2. 它在哪里比SettingsModel更有用

我看到了它们之间的区别,但想找到最好的用例。

何时使用ASP.NET 5选项模型

来自asp.net文档:

使用选项,您可以轻松将任何类(或POCO-纯旧CLR对象)转换为设置班建议您创建考虑因素良好的设置对象与应用程序中的某些功能相对应,因此遵循接口分离原则(ISP)(类取决于仅取决于它们使用的配置设置)以及关注点(管理应用程序不同部分的设置单独使用,因此不太可能对其中一个产生负面影响另一个)。

因此,您可以创建任何POCO类作为您的选项类:

public class MyOptions
{
    public string Option1 { get; set; }
    public int Option2 { get; set; }
}

然后为应用程序启用选项服务(添加MVC服务时已经完成):

//In your ConfigureServices method
services.AddOptions();

这允许您在任何需要访问您的选项的类上注入IOptions<YourOptionsClass>

public HomeController(IOptions<MyOptions> optionsAccessor)
{
    Options = optionsAccessor.Options;
}

难题的最后一块是如何配置(提供值)您的选项。

  • 最明显的方法是使用新的配置框架,例如,您可以使用config.json文件(您不需要创建新的配置对象,您可以重用MVC应用程序模板默认添加的配置对象)。一旦您有了配置对象,就可以调用Configure<YourOptionsClass>(Configuration):

    注意:当您将选项绑定到配置时,选项类型中的每个属性都绑定到格式为property:subperty:etc的配置键,这是不区分大小写的。

    //In your Startup method
    MyConfig = new ConfigurationBuilder()
                    .SetBasePath(appEnv.ApplicationBasePath)
                    .AddJsonFile("appsettings.json")
                    .Build();
    //In your ConfigureServices method
    services.Configure<MyOptions>(Configuration);
    
  • 您还可以使用委托,并通过运行任何需要的代码来初始化您的选项。例如,你可以提供一些硬编码的值(但你也可以做一些更复杂的事情,比如从数据库中读取):

    services.Configure<MyOptions>(myOptions =>
    {
        myOptions.Option1 = "Foo";
        myOptions.Option2 = 42;
    });
    

您可以添加多个Configure<MyOptions>调用,它们将按顺序应用。例如,您可以提供一些硬编码的值,并允许使用以下配置覆盖它们:

services.Configure<MyOptions>(myOptions =>
{
    ...
})
.Configure<MyOptions>(Configuration);

最后,在Configuration和Options框架之间,您有一种灵活、可扩展、可组合和松散耦合的方式来提供您的代码可能需要的设置。