当前位置:开发工具->.NET ->asp.net core选项配置的研究

原创版权标志asp.net core选项配置的研究

作者:阿郎  发表时间:2018/5/1 10:35:51  阅读:
[摘要] asp.net-core选项模块是全新,可拓展的框架,其作用在整个.net-core框架中,就像依赖注入一样无处不在,是一个很重要的组件。
使用支付宝扫码领红包,余额宝付款才可以使用红包哦!不要忘记哈。每天扫一次,天天赚红包!!可以将二维码保存到手机,每天直接扫码领红包啦!!
其实配置模块与选项模块是紧密相连的,我们可以使用ConfigureBuilder类来使用配置,但是在Startup类中,我们使用了依赖注入来实现IConfiguration接口(Startup类中的构造函数中使用依赖注入来实例化IConfiguration接口),通过这个接口对象来实现各种配置。但是配置不是我们主要讲的,这篇文章主要分析选项模块。
要说选项就一定要了解IOptions<TOptions>接口,这个接口只要有个属性:
public interface IOptions<out TOptions> where TOptions : class, new()
{
TOptions Value { get; }
}

在这里我们从两个示例来描述选项。第一个示例就是微软官网的选项示例。首先定义一个MyOptions类:
public class MyOptions
{
public string Option1 { get; set; }

public int Option2 { get; set; } = 5;

public MyOptions()
{
Option1 = "value1 from ctor";
}

}
依赖注入实例化MyOptions类:
// 非派生自IOptions的类 DI注入(具体可以参考源码)
services.Configure<MyOptions>(Configuration);

接下来我们在Index.cshtml.cs文件:
private readonly MyOptions _options;
public string SimpleOptions{ get; private set;}

然后在IndexModel的构造函数中注入(主要就是实现依赖注入):
public IndexModel(IOptions<MyOptions> optionAccessor)
{
_options = optionAccessor.Value;
}
在OnGet()方法中:
public void OnGet()
{
var option1 = _options.Option1;
var option2 = _options.Option2;
SimpleOptions = $"option1 = {option1}, option2 = {option2}";
}
接下来在就是Index.cshtml:
@page
@model IndexModel
@using OptionsBeta.Models
@{
    ViewData["Title"] = "Home page";
}

<h3>基本选项配置, 不派生自IOptions接口的实现</h3>
@Model.SimpleOptions

但是一般情况下我们都是继承自IOptions接口做我们自己的选项。那么应该怎么来做呢?代码如下:
public class MyOptionsDelegate : IOptions<MyOptionsDelegate>
{
public MyOptionsDelegate()
{
Option1 = "value1 from ctor";
}

public string Option1 { get; set; }
public int Option2 { get; set; } = 5;

public MyOptionsDelegate Value
{
get { return this; }
}
}

我们实现一个IOptions<TOptions>的类,接着我们基于IServiceCollection接口拓展一个方法:
public static IServiceCollection AddOptionsByDelegate(this IServiceCollection services, Action<MyOptionsDelegate> setupAction)
{
services.Configure(setupAction);
return services;
}
然后我们在ConfigurationServices方法中注入实例:
// 拓展方法的方式实现
services.AddOptionsByDelegate(myOptions =>
{
myOptions.Option1 = "rrrrrrrrrrrrrrrrrrrrrrrrrr";
myOptions.Option2 = 280000;
});
接下来,Index.cshtml.cs文件:
private readonly MyOptionsDelegate _optionsDelagate;
public IndexModel(IOptions<MyOptions> optionAccessor, IOptions<MyOptionsDelegate> optionsDelegate)
{
_options = optionAccessor.Value;
_optionsDelagate = optionsDelegate.Value;
}
public string SimpleOptionsByDelagate { get; private set; }

在OnGet方法中:
var optionsByDelegate3 = _optionsDelagate.Option1;
var optionsByDelegate4 = _optionsDelagate.Option2;
SimpleOptionsByDelagate = $"optionsByDelegate3 = {optionsByDelegate3}, optionsByDelegate4 = {optionsByDelegate4}";

在Index.cshtml中:
<h3>基于委托配置简单选项, 派生自IOptions接口的实现并使用了拓展方法的方式注入依赖</h3>
@Model.SimpleOptionsByDelagate
微信扫码关注公众号CPP技术网,微信号cpp_coder,关注我们的公众号,阅读更多精彩内容!每天还可以领取大红包哦!!!每天还可以领取大红包哦!!!每天还可以领取大红包哦!!!
文章来源:C++技术网原创文章版权为网站和作者共同所有,会员文章禁止转载。非会员文章转载做好本文超链接即表示授权转载。通过文章下面的分享按钮可以自由分享所有文章。

返回顶部

在线提问
问题标题:
问题描述:(简陋的描述会导致问题被最后回答、没有针对性回答甚至无法解答。请确保问题描述的足够清楚。)